Eu li como simplesmente importar um arquivo bacana em outro script bacana
Quero definir funções comuns em um arquivo bacana e chamar essas funções de outros arquivos bacanas.
Eu entendo que isso seria usar o Groovy como uma linguagem de script, ou seja, eu não preciso de classes / objetos. Estou tentando algo como DSL que pode ser feito no groovy. Todas as variáveis serão declaradas do Java e eu quero executar um script groovy em um shell.
Isso é possível em tudo ? Alguém pode dar algum exemplo.
Respostas:
Coloque isso no topo do seu script. Isso trará o conteúdo de um arquivo bacana (apenas substitua o nome do arquivo entre as aspas pelo seu script bacana).
Eu faço isso com uma classe surpreendentemente chamada "Tools.groovy".
fonte
A partir do Groovy 2.2, é possível declarar uma classe de script base com a nova
@BaseScript
anotação de transformação AST.Exemplo:
arquivo MainScript.groovy :
arquivo test.groovy :
fonte
Outra maneira de fazer isso é definir as funções em uma classe bacana, analisar e adicionar o arquivo ao classpath em tempo de execução:
fonte
GroovyObject
explicitamente, isso não é um espaço reservado para o seu próprio nome de classe.Eu acho que a melhor escolha é organizar coisas utilitárias na forma de classes bacanas, adicioná-las ao classpath e deixar o script principal se referir a elas por meio da palavra-chave import.
Exemplo:
scripts / DbUtils.groovy
scripts / script1.groovy:
executando script:
fonte
lib
esrc
diretóriosA maneira que faço isso é com
GroovyShell
.fonte
O Groovy não tem uma palavra-chave de importação como as linguagens de script típicas que farão uma inclusão literal do conteúdo de outro arquivo (aludido aqui: O groovy fornece um mecanismo de inclusão? ).
Por causa de sua natureza orientada a objeto / classe, você precisa "brincar" para fazer coisas como essa funcionarem. Uma possibilidade é tornar todas as funções do seu utilitário estáticas (já que você disse que elas não usam objetos) e, em seguida, executar uma importação estática no contexto do shell em execução. Em seguida, você pode chamar esses métodos como "funções globais".
Outra possibilidade seria usar um objeto Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) ao criar seu Shell e vincular todas as funções desejadas aos métodos (a desvantagem aqui seria ter de enumerar todos os métodos na vinculação, mas talvez você pudesse usar reflexão). Outra solução seria sobrescrever
methodMissing(...)
no objeto delegado atribuído ao seu shell, o que permite basicamente fazer o despacho dinâmico usando um mapa ou qualquer método que desejar.Vários desses métodos são demonstrados aqui: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Deixe-me saber se você deseja ver um exemplo de uma técnica específica.
fonte
Que tal tratar o script externo como uma classe Java? Com base neste artigo: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy O script externo
printThing.groovy O script principal
Resultado
fonte
Aqui está um exemplo completo de inclusão de um script dentro de outro.
Basta executar o arquivo Testmain.groovy.
Comentários explicativos incluídos porque sou legal assim;]
Testutils.groovy
Testmain.groovy
fonte
Para os que chegaram mais tarde, parece que o groovy agora suporta o
:load file-path
comando que simplesmente redireciona a entrada do arquivo fornecido, então agora é trivial incluir scripts de biblioteca.Funciona como entrada para o groovysh e como uma linha em um arquivo carregado:
groovy:000> :load file1.groovy
file1.groovy pode conter:
:load path/to/another/file invoke_fn_from_file();
fonte
:load file-path
?groovy:000> :load file1.groovy
file1.groovy pode conter: <br/>:load path/to/another/file
Uma combinação de respostas @grahamparks e @snowindy com algumas modificações é o que funcionou para meus scripts Groovy em execução no Tomcat:
Utils.groovy
MyScript.groovy:
fonte
O Groovy pode importar outras classes incríveis exatamente como o Java faz. Apenas certifique-se de que a extensão do arquivo de biblioteca é .groovy.
fonte
Após alguma investigação, cheguei à conclusão de que a abordagem a seguir parece a melhor.
some / subpackage / Util.groovy
exemplo.groovy
Para executar o
example.groovy
script, adicione-o ao caminho do sistema e digite em qualquer diretório:O script imprime:
O exemplo acima foi testado no seguinte ambiente:
Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
O exemplo demonstra o seguinte:
Util
classe dentro de um script bacana.Util
classe que chama aGuava
biblioteca de terceiros incluindo-a como umaGrape
dependência (@Grab('com.google.guava:guava:23.0')
).Util
classe pode residir em um subdiretório.Util
classe.Comentários / sugestões adicionais:
new Util()
, mas o mais importante, ela teria que ser colocada em um arquivo denominado qualquer coisa menos Util.groovy. Consulte Scripts versus classes para obter mais detalhes sobre as diferenças entre scripts e classes excelentes."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
vez de"some/subpackage/Util.groovy"
. Isso garantirá que oUtil.groovy
arquivo sempre será encontrado em relação à localização do script groovy (example.groovy
) e não ao diretório de trabalho atual. Por exemplo, usar"some/subpackage/Util.groovy"
resultaria na pesquisa emWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
é um nome de script eMyClass.groovy
é um nome de classe. A nomenclaturamy-script.groovy
resultará em erros de tempo de execução em certos cenários porque a classe resultante não terá um nome de classe Java válido.fonte