অন্য গ্রোভির একটি গ্রোভি স্ক্রিপ্ট সহ


99

আমি অন্য গ্রোভি স্ক্রিপ্টে কীভাবে কেবল গ্রুভি ফাইল আমদানি করতে পারি তা আমি পড়েছি

আমি একটি গ্রোভি ফাইলে সাধারণ ফাংশন সংজ্ঞায়িত করতে এবং অন্যান্য গ্রোভী ফাইলগুলি থেকে সেই ফাংশনগুলিকে কল করতে চাই।

আমি বুঝতে পারি এটি গ্রোভিকে স্ক্রিপ্টিং ভাষার মতো ব্যবহার করবে অর্থাৎ আমার ক্লাস / অবজেক্টের প্রয়োজন নেই। আমি ডিএসএল এর মতো কিছু করার চেষ্টা করছি যা গ্রোভির মাধ্যমে করা যায়। সমস্ত ভেরিয়েবল জাভা থেকে জোর দেওয়া হবে এবং আমি শেলটিতে গ্রোভি স্ক্রিপ্ট চালাতে চাই।

এটা কি আদৌ সম্ভব ? কেউ কিছু উদাহরণ দিতে পারে।


উত্তর:


109
evaluate(new File("../tools/Tools.groovy"))

এটি আপনার স্ক্রিপ্টের শীর্ষে রাখুন। এটি গ্রোভী ফাইলের বিষয়বস্তু নিয়ে আসবে (কেবলমাত্র আপনার গ্রোভি স্ক্রিপ্টের সাথে ডাবল উদ্ধৃতিগুলির মধ্যে ফাইলের নামটি প্রতিস্থাপন করুন)।

আমি আশ্চর্যজনকভাবে "সরঞ্জামস.govovy" নামে পরিচিত একটি শ্রেণীর সাথে এটি করি।


7
ফাইলটির এই কাজের জন্য জাভা শ্রেণীর নামকরণের নিয়মগুলির সাথে সামঞ্জস্য করা দরকার।
উইলকিল

4
প্রশ্ন - আমি এই সিনট্যাক্সটি ব্যবহার করে যে স্ক্রিপ্টটি মূল্যায়ন করছি তাতে আমি কীভাবে যুক্তিগুলি পাস করতে পারি?
স্টিভ

4
@ স্টিভ আপনি পারবেন না, তবে আপনি সেই স্ক্রিপ্টের কোনও ফাংশন সংজ্ঞায়িত করতে পারেন যা আপনি যুক্তি দিয়ে
ডাকছেন

11
এটি কাজ করে না ... স্ক্রিপ্টটি ভালভাবে মূল্যায়ন করা হয় তবে কলার স্কোপে (
ডিএফ

4
আপনাকে অবশ্যই কলটি থেকে কোনও জিনিস ফেরত দিতে হবে, তারপরে ভেরিয়েবলের জন্য মূল্যায়ন ফলাফল নির্ধারণ করুন।
লোগানমজ

45

গ্রোভি ২.২ অনুসারে নতুন @BaseScriptএএসটি রূপান্তর টীকা সহ বেস স্ক্রিপ্ট শ্রেণি ঘোষণা করা সম্ভব ।

উদাহরণ:

মেইনস্ক্রিপ্ট.groovy ফাইল :

abstract class MainScript extends Script {
    def meaningOfLife = 42
}

ফাইল টেস্ট.groovy :

import groovy.transform.BaseScript
@BaseScript MainScript mainScript

println "$meaningOfLife" //works as expected

4
এই পদ্ধতিটি ব্যবহার করার সময় আমি "ক্লাস সমাধানে অক্ষম" হতে থাকি। আপনি আমাকে কি সুপারিশ করবেন? অন্য গ্রোভি স্ক্রিপ্টে কাস্টম ক্লাস আমদানির কোনও উপায় আছে কি?
droidnoob

38

এটি করার আরেকটি উপায় হ'ল গ্রোভি ক্লাসে ফাংশনগুলি সংজ্ঞায়িত করা এবং পার্স করা এবং রানটাইমে ফাইলটি ক্লাসপথে যুক্ত করা:

File sourceFile = new File("path_to_file.groovy");
Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(sourceFile);
GroovyObject myObject = (GroovyObject) groovyClass.newInstance();

4
এই সমাধানটি আসলে আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। আমি যখন স্বীকৃত উত্তরটি ব্যবহার করার চেষ্টা করেছি, তখন আমার ত্রুটি হয়েছিল যে আমার মূল গ্রুভি স্ক্রিপ্ট মূল্যায়িত স্ক্রিপ্টে বর্ণিত শ্রেণিটি সমাধান করতে অক্ষম। এটির জন্য কী মূল্য ...
সিব্লায়েন

4
আমি এসওতে পোস্ট করা বেশ কয়েকটি ভিন্ন পদ্ধতির চেষ্টা করেছি এবং কেবল এটিই কাজ করেছিল। অন্যরা ক্লাস বা পদ্ধতিগুলি সমাধান করতে না পেরে ত্রুটি নিক্ষেপ করেছে। এই সংস্করণটি আমি সংস্করণ গ্রোভি সংস্করণটি ব্যবহার করছি: ২.২.২ জেভিএম: 1.8.0 বিক্রেতার: ওরাকল কর্পোরেশন ওএস: উইন্ডোজ 7.
কুবেরচাঁন

4
এটি দুর্দান্ত কাজ করেছে। GroovyObjectস্পষ্টভাবে ব্যবহার নিশ্চিত করুন , এটি আপনার নিজের শ্রেণীর নামের জন্য স্থানধারক নয়।
haventchecked

4
তবুও আমি পেয়েছি: java.lang.NoClassDefFoundError: groovy.lang.GroovyObject
ডোকাস্পার

জীবন রক্ষাকারী ধন্যবাদ সাথী !!
অঞ্জনা সিলভা

30

আমি মনে করি যে সর্বোত্তম পছন্দটি গ্রোভি ক্লাস আকারে ইউটিলিটি জিনিসগুলি সংগঠিত করা, তাদের ক্লাসপাথে যুক্ত করা এবং মুখ্য স্ক্রিপ্টটি আমদানি কীওয়ার্ডের মাধ্যমে তাদের উল্লেখ করা যাক।

উদাহরণ:

স্ক্রিপ্ট / DbUtils.groovy

class DbUtils{
    def save(something){...}
}

স্ক্রিপ্ট / স্ক্রিপ্ট 1.groovy:

import DbUtils
def dbUtils = new DbUtils()
def something = 'foobar'
dbUtils.save(something)

চলমান স্ক্রিপ্ট:

cd scripts
groovy -cp . script1.groovy

আমি অবাক হই যে libsrc
এটির

9

আমি যেভাবে এটি করি তা হল GroovyShell

GroovyShell shell = new GroovyShell()
def Util = shell.parse(new File('Util.groovy'))
def data = Util.fetchData()

7

গ্রোভির কাছে সাধারণত স্ক্রিপ্টিং ভাষার মতো একটি আমদানি কীওয়ার্ড নেই যা আক্ষরিকভাবে অন্য কোনও ফাইলের বিষয়বস্তুগুলিকে অন্তর্ভুক্ত করে (এখানে ইঙ্গিত করা হয়েছে: গ্রোভির একটি অন্তর্ভুক্ত প্রক্রিয়া সরবরাহ করে? )
এর অবজেক্ট / শ্রেণিকেন্দ্রিক প্রকৃতির কারণে আপনাকে এই কাজের মতো জিনিসগুলি তৈরি করতে "গেমস" খেলতে হবে। একটি সম্ভাবনা হ'ল আপনার সমস্ত ইউটিলিটি ফাংশনগুলি স্থিতিশীল করা (যেহেতু আপনি বলেছিলেন যে তারা অবজেক্ট ব্যবহার করে না) এবং তারপরে আপনার এক্সিকিউটিভ শেলের প্রসঙ্গে স্ট্যাটিক আমদানি করা। তারপরে আপনি এই পদ্ধতিগুলিকে "গ্লোবাল ফাংশন" এর মতো কল করতে পারেন। ) আপনার শেলটি তৈরি করার সময় এবং পদ্ধতিগুলিতে আপনি যে সমস্ত ক্রিয়াকলাপ চান তা বাঁধার সময় (এখানে ডাউনসাইডে বাইন্ডিংয়ের সমস্ত পদ্ধতি গণনা করতে হবে তবে আপনি সম্ভবত প্রতিচ্ছবি ব্যবহার করতে পারেন)। তবুও আরেকটি সমাধান হ'ল ওভাররাইড করা
আরেকটি সম্ভাবনা হ'ল একটি বাঁধাই করা অবজেক্ট ব্যবহার করা হবে ( http://groovy.codehaus.org/api/groovy/lang/Binding.htmlmethodMissing(...) আপনার শেলকে বরাদ্দ করা প্রতিনিধি অবজেক্টে যা আপনাকে ম্যাপ বা আপনার পছন্দসই পদ্ধতিটি ব্যবহার করে মূলত গতিশীল প্রেরণ করতে দেয়।

এর মধ্যে বেশ কয়েকটি পদ্ধতি এখানে প্রদর্শিত হয়: http : //www.nextin تعمیر . com / blog / 2012 / 01 / 08 / creating-dsls-with-groovy/ । আপনি যদি কোনও নির্দিষ্ট প্রযুক্তির উদাহরণ দেখতে চান তবে আমাকে জানান।


7
এই লিঙ্কটি এখন মারা গেছে
নিকোলাস মোম্মার্টস

7

বাহ্য স্ক্রিপ্টটিকে জাভা ক্লাস হিসাবে গণ্য করবেন কীভাবে? এই নিবন্ধের ভিত্তিতে: https://www.jmdawson.net/blog/2014/08/18/using-function-from-one-groovy-script-in-another/

getThing.groovy বাহ্যিক স্ক্রিপ্ট

def getThingList() {
    return ["thing","thin2","thing3"]
}

printThing.groovy দ্য প্রধান স্ক্রিপ্ট

thing = new getThing()  // new the class which represents the external script
println thing.getThingList()

ফলাফল

$ groovy printThing.groovy
[thing, thin2, thing3]

আপনি যদি আপনার স্ক্রিপ্ট উত্স ভান্ডারের বাইরে চালাচ্ছেন তবে কাজ করবে না
ইউজেন

6

অন্য স্ক্রিপ্টের মধ্যে একটির স্ক্রিপ্ট অন্তর্ভুক্ত করার সম্পূর্ণ উদাহরণ এখানে।
কেবলমাত্র টেস্টমেন.groovy ফাইলটি চালিত করুন
ব্যাখ্যামূলক মন্তব্যগুলি অন্তর্ভুক্ত কারণ আমি এর মতো সুন্দর;]

Testutils.groovy

// This is the 'include file'
// Testmain.groovy will load it as an implicit class
// Each method in here will become a method on the implicit class

def myUtilityMethod(String msg) {
    println "myUtilityMethod running with: ${msg}"
}

টেস্টমেন.groovy

// Run this file

// evaluate implicitly creates a class based on the filename specified
evaluate(new File("./Testutils.groovy"))
// Safer to use 'def' here as Groovy seems fussy about whether the filename (and therefore implicit class name) has a capital first letter
def tu = new Testutils()
tu.myUtilityMethod("hello world")

0

দেরী-আগতদের জন্য, এটি গ্রোভি এখন এই :load file-pathআদেশটি সমর্থন করে যা প্রদত্ত ফাইল থেকে ইনপুটটিকে পুনঃনির্দেশ করে, সুতরাং এটি এখন লাইব্রেরি স্ক্রিপ্টগুলি অন্তর্ভুক্ত করার জন্য তুচ্ছ।

এটি গ্রোভিশে ইনপুট হিসাবে এবং একটি বোঝা ফাইলের লাইন হিসাবে কাজ করে:
groovy:000> :load file1.groovy

file1.groovy থাকতে পারে:
:load path/to/another/file invoke_fn_from_file();


আপনি কি এই উপর প্রসারিত করতে পারেন? ডক্সে এটি কোথায়? আমি কোথায় রাখব :load file-path?
ক্রিস্টোফার হামারস্ট্রিম

ঠিক আছে, এটি গ্রোভিশ ইনপুট এবং লোড হওয়া ফাইলের লাইন হিসাবে কাজ করে: <br/> groovy:000> :load file1.groovy file1.groovy এতে থাকতে পারে: <br/>:load path/to/another/file
জ্যাক প্যান্ট

4
আমি ডক্সে বোঝা পেয়েছি । আমি যদি সঠিকভাবে বুঝতে পারি তবে এটি কেবল গ্রোভিশের সাথেই কাজ করে?
ক্রিস্টোফার হামারস্ট্রিম

এটি কোনও ভেরিয়েবলের ভিতরে সংজ্ঞায়িত পথটির সাথে কাজ করবে না, যদিও তা হবে?
ব্যবহারকারী 2173353

0

টমক্যাটটিতে চলমান আমার গ্রোভি স্ক্রিপ্টগুলির জন্য কাজ করেছে: বেশ কয়েকটি সংশোধন করে @ গ্রাহাম্পার্কস এবং @ সান্নিদি উত্তরগুলির সংমিশ্রণ:

Utils.groovy

class Utils {
    def doSth() {...}
}

মাইস্ক্রিপ্ট.groovy:

/* import Utils --> This import does not work. The class is not even defined at this time */
Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(new File("full_path_to/Utils.groovy")); // Otherwise it assumes current dir is $CATALINA_HOME
def foo = groovyClass.newInstance(); // 'def' solves compile time errors!!
foo.doSth(); // Actually works!

আমি পেয়েছি: java.lang.NoClassDefFoundError: groovy.lang.GroovyObject
dokaspar

0

গ্রোভি জাভা যেমন ঠিক তেমন অন্যান্য গ্রোভি ক্লাস আমদানি করতে পারে। লাইব্রেরি ফাইলটির সম্প্রসারণ .groovy কেবল তা নিশ্চিত হয়ে নিন।

    $ cat lib/Lib.groovy
    package lib
    class Lib {
       static saySomething() { println 'something' }
       def sum(a,b) { a+b }
    }

    $ cat app.gvy
    import lib.Lib
    Lib.saySomething();
    println new Lib().sum(37,5)

    $ groovy app
    something
    42

-1

কিছু তদন্তের পরে আমি এই সিদ্ধান্তে পৌঁছেছি যে নিম্নলিখিত পদ্ধতিটি সবচেয়ে ভাল বলে মনে হচ্ছে।

কিছু / subpackage / Util.groovy

@GrabResolver(name = 'nexus', root = 'https://local-nexus-server:8443/repository/maven-public', m2Compatible = true)
@Grab('com.google.errorprone:error_prone_annotations:2.1.3')
@Grab('com.google.guava:guava:23.0')
@GrabExclude('com.google.errorprone:error_prone_annotations')

import com.google.common.base.Strings

class Util {
    void msg(int a, String b, Map c) {
        println 'Message printed by msg method inside Util.groovy'
        println "Print 5 asterisks using the Guava dependency ${Strings.repeat("*", 5)}"
        println "Arguments are a=$a, b=$b, c=$c"
    }
}

উদাহরণস্বরূপ

#!/usr/bin/env groovy
Class clazz = new GroovyClassLoader().parseClass("${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" as File)
GroovyObject u = clazz.newInstance()
u.msg(1, 'b', [a: 'b', c: 'd'])

example.groovyস্ক্রিপ্টটি চালানোর জন্য , এটি আপনার সিস্টেমের পথে যুক্ত করুন এবং যে কোনও ডিরেক্টরি থেকে টাইপ করুন:

example.groovy

স্ক্রিপ্ট প্রিন্ট করে:

Message printed by msg method inside Util.groovy
Print 5 asterisks using the Guava dependency *****
Arguments are a=1, b=b, c=[a:b, c:d]

উপরোক্ত উদাহরণটি নিম্নলিখিত পরিবেশে পরীক্ষা করা হয়েছিল: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux

উদাহরণটি নিম্নলিখিতটি দেখায়:

  • Utilগ্রোভি স্ক্রিপ্টের অভ্যন্তরে কীভাবে ক্লাস ব্যবহার করবেন ।
  • তৃতীয় পক্ষের গ্রন্থাগারটিকে নির্ভরতা ( ) হিসাবে অন্তর্ভুক্ত করে Utilকল করার একটি শ্রেণি ।GuavaGrape@Grab('com.google.guava:guava:23.0')
  • Utilবর্গ একটি সাব-রক্ষিত পারবেন না।
  • Utilক্লাসের মধ্যে একটি পদ্ধতিতে তর্ক বিতরণ করা ।

অতিরিক্ত মন্তব্য / পরামর্শ:

  • আপনার গ্রোভি স্ক্রিপ্টগুলির মধ্যে পুনরায় ব্যবহারযোগ্য কার্যকারিতার জন্য গ্রুভি স্ক্রিপ্টের পরিবর্তে সর্বদা গ্রুভি ক্লাস ব্যবহার করুন। উপরের উদাহরণটি Util.groovy ফাইলে সংজ্ঞায়িত ইউটিল ক্লাস ব্যবহার করে। পুনরায় ব্যবহারযোগ্য কার্যকারিতার জন্য গ্রোভি স্ক্রিপ্টগুলি ব্যবহার করা সমস্যাযুক্ত। উদাহরণস্বরূপ, যদি গ্রোভি স্ক্রিপ্ট ব্যবহার করা হয় তবে ইউটিল শ্রেণীর সাথে স্ক্রিপ্টের নীচে ইনস্ট্যান্ট করাতে হবে new Util(), তবে সবচেয়ে গুরুত্বপূর্ণ বিষয়টি এটি ইউটিলি.groovy ব্যতীত অন্য কোনও ফাইলের মধ্যে স্থাপন করতে হবে। পড়ুন শ্রেণীর বনাম স্ক্রিপ্ট খাঁজকাটা স্ক্রিপ্ট এবং খাঁজকাটা শ্রেণীর ভিন্নতা নিয়ে আরো বিস্তারিত জানার জন্য।
  • উপরের উদাহরণে আমি এর "${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"পরিবর্তে পথটি ব্যবহার করি "some/subpackage/Util.groovy"। এটি গ্যারান্টি দিবে যে Util.groovyফাইলটি সর্বদা বর্তমান গ্রাফিক স্ক্রিপ্টের অবস্থান ( example.groovy) এর সাথে সম্পর্কিত এবং বর্তমান কার্যনির্বাহী ডিরেক্টরি সম্পর্কিত নয়। উদাহরণস্বরূপ, ব্যবহারের "some/subpackage/Util.groovy"ফলে অনুসন্ধানে ফলাফল হবে WORK_DIR/some/subpackage/Util.groovy
  • আপনার গ্রোভি স্ক্রিপ্টগুলির নাম দেওয়ার জন্য জাভা ক্লাসের নামকরণ কনভেনশন অনুসরণ করুন। আমি ব্যক্তিগতভাবে একটি ছোট বিচ্যুতি পছন্দ করি যেখানে স্ক্রিপ্টগুলি মূলধনের পরিবর্তে একটি নিম্ন বর্ণ দিয়ে শুরু হয়। উদাহরণস্বরূপ, myScript.groovyএকটি স্ক্রিপ্টের নাম এবং MyClass.groovyএটি একটি শ্রেণীর নাম। নামকরণের my-script.groovyফলে নির্দিষ্ট পরিস্থিতিতে রানটাইম ত্রুটি ঘটবে কারণ ফলাফলকারী শ্রেণীর একটি বৈধ জাভা শ্রেণীর নাম থাকবে না।
  • জেভিএম বিশ্বে সাধারণভাবে সম্পর্কিত কার্যকারিতাটির নাম দেওয়া হয় জেএসআর 223: জাভার স্ক্রিপ্টিং । গ্রোভিতে বিশেষত কার্যকারিতাটির নাম গ্রোভী ইন্টিগ্রেশন মেকানিজম । প্রকৃতপক্ষে, গ্রোভী বা জাভা থেকে যে কোনও জেভিএম ভাষা কল করতে একই পন্থাটি ব্যবহার করা যেতে পারে । এ জাতীয় জেভিএম ভাষার কয়েকটি উল্লেখযোগ্য উদাহরণ হ'ল গ্রোভি, জাভা, স্কালা, জে রুবি এবং জাভাস্ক্রিপ্ট (রাইনো)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.