Przeczytałem, jak po prostu zaimportować groovy plik do innego groovy skryptu
Chcę zdefiniować wspólne funkcje w jednym pliku groovy i wywołać te funkcje z innych plików groovy.
Rozumiem, że byłoby to używanie Groovy jako języka skryptowego, tj. Nie potrzebuję klas / obiektów. Próbuję czegoś takiego jak dsl, które można zrobić w groovy. Wszystkie zmienne zostaną potwierdzone z Javy i chcę wykonać groovy skrypt w powłoce.
Czy to w ogóle możliwe? Czy ktoś może podać jakiś przykład.
Odpowiedzi:
Umieść to na początku swojego skryptu. Spowoduje to wyświetlenie zawartości groovy pliku (po prostu zastąp nazwę pliku między podwójnymi cudzysłowami swoim groovym skryptem).
Robię to z klasą o zadziwiającej nazwie „Tools.groovy”.
źródło
Począwszy od Groovy 2.2 możliwe jest zadeklarowanie podstawowej klasy skryptu z nową
@BaseScript
adnotacją transformacji AST.Przykład:
plik MainScript.groovy :
plik test.groovy :
źródło
Innym sposobem na to jest zdefiniowanie funkcji w groovy klasy i przeanalizowanie i dodanie pliku do ścieżki klas w czasie wykonywania:
źródło
GroovyObject
jawnie, to nie jest symbol zastępczy dla własnej nazwy klasy.Myślę, że najlepszym wyborem jest zorganizowanie rzeczy użytkowych w formie groovy, dodanie ich do ścieżki klas i pozwolenie głównemu skryptowi odwoływać się do nich poprzez słowo kluczowe import.
Przykład:
scripts / DbUtils.groovy
scripts / script1.groovy:
uruchomiony skrypt:
źródło
lib
isrc
katalogiSposób, w jaki to robię, jest
GroovyShell
.źródło
Groovy nie ma słowa kluczowego importu, takiego jak typowe języki skryptowe, które będą dosłownie włączać zawartość innego pliku (nawiązanie do tego: Czy groovy zapewnia mechanizm włączania? ).
Ze względu na jego obiektową / klasową naturę, musisz „grać w gry”, aby takie rzeczy działały. Jedną z możliwości jest uczynienie wszystkich funkcji narzędziowych statycznymi (ponieważ powiedziałeś, że nie używają one obiektów), a następnie wykonanie statycznego importu w kontekście wykonywanej powłoki. Następnie możesz nazwać te metody „funkcjami globalnymi”.
Inną możliwością byłoby użycie obiektu Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) podczas tworzenia powłoki i wiązania wszystkich funkcji, które chcesz, z metodami (minusem byłoby tutaj wyliczenie wszystkich metod w powiązaniu, ale być może możesz użyć odbicia). Jeszcze innym rozwiązaniem byłoby nadpisanie
methodMissing(...)
w obiekcie delegata przypisanym do twojej powłoki, który pozwala w zasadzie na dynamiczne wysyłanie przy użyciu mapy lub dowolnej metody.Kilka z tych metod przedstawiono tutaj: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Daj mi znać, jeśli chcesz zobaczyć przykład konkretnej techniki.
źródło
Co powiesz na traktowanie zewnętrznego skryptu jako klasy Javy? Na podstawie tego artykułu: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy Skrypt zewnętrzny
printThing.groovy Główny skrypt
Wynik
źródło
Oto kompletny przykład włączenia jednego skryptu do drugiego.
Po prostu uruchom plik Testmain.groovy Dołączone
komentarze wyjaśniające, ponieważ jestem taki miły;]
Testutils.groovy
Testmain.groovy
źródło
Dla spóźnionych wygląda na to, że groovy teraz obsługują
:load file-path
polecenie, które po prostu przekierowuje dane wejściowe z danego pliku, więc teraz trywialne jest dołączanie skryptów bibliotecznych.Działa jako wejście do groovysh & jako linia w załadowanym pliku:
groovy:000> :load file1.groovy
plik1.groovy może zawierać:
:load path/to/another/file invoke_fn_from_file();
źródło
:load file-path
?groovy:000> :load file1.groovy
plik1.groovy może zawierać: <br/>:load path/to/another/file
Połączenie odpowiedzi @grahamparks i @snowindy z kilkoma modyfikacjami sprawdziło się w przypadku moich skryptów Groovy działających na Tomcat:
Utils.groovy
MyScript.groovy:
źródło
Groovy może importować inne groovy klasy, dokładnie tak, jak robi to Java. Upewnij się tylko, że rozszerzenie pliku biblioteki to .groovy.
źródło
Po pewnym dochodzeniu doszedłem do wniosku, że następujące podejście wydaje się najlepsze.
jakiś / subpackage / Util.groovy
example.groovy
Aby uruchomić
example.groovy
skrypt, dodaj go do ścieżki systemowej i wpisz z dowolnego katalogu:Skrypt drukuje:
Powyższy przykład został przetestowany w następującym środowisku:
Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Przykład pokazuje, co następuje:
Util
klasy w świetnym skrypcie.Util
Klasa wywołanieGuava
biblioteki strony trzeciej, włączając go jakoGrape
zależność (@Grab('com.google.guava:guava:23.0')
).Util
Klasy mogą znajdować się w podkatalogu.Util
klasie.Dodatkowe uwagi / sugestie:
new Util()
, ale co najważniejsze, musiałaby zostać umieszczona w pliku o nazwie cokolwiek innego niż Util.groovy. Zobacz Skrypty a klasy , aby uzyskać więcej informacji na temat różnic między porywające skryptów i klas porywające."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
zamiast"some/subpackage/Util.groovy"
. Gwarantuje to, żeUtil.groovy
plik będzie zawsze znajdowany w odniesieniu do lokalizacji skryptu groovy (example.groovy
), a nie do bieżącego katalogu roboczego. Na przykład użycie"some/subpackage/Util.groovy"
spowoduje wyszukanie wWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
to nazwa skryptu, aMyClass.groovy
to nazwa klasy. Nazewnictwomy-script.groovy
spowoduje błędy w czasie wykonywania w niektórych scenariuszach, ponieważ wynikowa klasa nie będzie miała prawidłowej nazwy klasy Java.źródło