Saya telah membaca cara mengimpor file keren dalam skrip keren lainnya
Saya ingin mendefinisikan fungsi umum dalam satu file keren dan memanggil fungsi tersebut dari file keren lainnya.
Saya mengerti ini akan menggunakan Groovy seperti bahasa scripting yaitu, saya tidak perlu kelas / objek. Saya mencoba sesuatu seperti dsl yang bisa dilakukan dengan menyenangkan. Semua variabel akan ditetapkan dari Java dan saya ingin menjalankan skrip keren di shell.
Apakah ini mungkin? Dapatkah seseorang memberikan beberapa contoh.
Jawaban:
Letakkan itu di bagian atas skrip Anda. Itu akan membawa konten file yang keren (ganti saja nama file di antara tanda kutip ganda dengan skrip keren Anda).
Saya melakukan ini dengan kelas yang secara mengejutkan disebut "Tools.groovy".
sumber
Pada Groovy 2.2 dimungkinkan untuk mendeklarasikan kelas skrip dasar dengan
@BaseScript
anotasi transformasi AST yang baru .Contoh:
file MainScript.groovy :
file test.groovy :
sumber
Cara lain untuk melakukannya adalah dengan mendefinisikan fungsi dalam kelas yang menarik dan mengurai serta menambahkan file ke classpath saat runtime:
sumber
GroovyObject
secara eksplisit, itu bukan placeholder untuk nama kelas Anda sendiri.Saya pikir pilihan terbaik adalah mengatur hal-hal utilitas dalam bentuk kelas yang menyenangkan, menambahkannya ke classpath dan membiarkan skrip utama merujuknya melalui kata kunci import.
Contoh:
scripts / DbUtils.groovy
skrip / script1.groovy:
menjalankan skrip:
sumber
lib
dansrc
direktoriCara saya melakukan ini adalah dengan
GroovyShell
.sumber
Groovy tidak memiliki kata kunci impor seperti bahasa skrip biasa yang akan memasukkan konten file lain secara literal (disinggung di sini: Apakah groovy menyediakan mekanisme penyertaan? ).
Karena sifatnya yang berorientasi objek / kelas, Anda harus "bermain-main" untuk membuat hal-hal seperti ini berhasil. Salah satu kemungkinannya adalah membuat semua fungsi utilitas Anda statis (karena Anda mengatakan mereka tidak menggunakan objek) dan kemudian melakukan impor statis dalam konteks shell yang Anda jalankan. Kemudian Anda dapat memanggil metode ini seperti "fungsi global".
Kemungkinan lain adalah menggunakan objek Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) saat membuat Shell Anda dan mengikat semua fungsi yang Anda inginkan ke metode (sisi negatifnya di sini harus menyebutkan semua metode dalam penjilidan tetapi Anda mungkin dapat menggunakan refleksi). Namun solusi lain adalah menimpa
methodMissing(...)
objek delegasi yang ditugaskan ke shell Anda yang pada dasarnya memungkinkan Anda melakukan pengiriman dinamis menggunakan peta atau metode apa pun yang Anda inginkan.Beberapa dari metode ini ditunjukkan di sini: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Beri tahu saya jika Anda ingin melihat contoh teknik tertentu.
sumber
Bagaimana jika memperlakukan skrip eksternal sebagai kelas Java? Berdasarkan artikel ini: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy Skrip eksternal
printThing.groovy Skrip utama
Hasil
sumber
Berikut adalah contoh lengkap memasukkan satu skrip ke dalam skrip lainnya.
Jalankan saja file Testmain.groovy
Penjelasan komentar disertakan karena saya baik seperti itu;]
Testutils.groovy
Testmain.groovy
sumber
Untuk pengguna yang terlambat, tampaknya groovy sekarang mendukung
:load file-path
perintah yang hanya mengalihkan masukan dari file yang diberikan, jadi sekarang mudah untuk menyertakan skrip perpustakaan.Ini berfungsi sebagai input ke groovysh & sebagai baris dalam file yang dimuat:
groovy:000> :load file1.groovy
file1.groovy dapat berisi:
:load path/to/another/file invoke_fn_from_file();
sumber
:load file-path
?groovy:000> :load file1.groovy
file1.groovy dapat berisi: <br/>:load path/to/another/file
Kombinasi jawaban @grahamparks dan @snowindy dengan beberapa modifikasi adalah yang berhasil untuk skrip Groovy saya yang berjalan di Tomcat:
Utils.groovy
MyScript.groovy:
sumber
Groovy dapat mengimpor kelas groovy lainnya persis seperti Java. Pastikan ekstensi file pustaka adalah .groovy.
sumber
Setelah beberapa penyelidikan saya sampai pada kesimpulan bahwa pendekatan berikut tampaknya yang terbaik.
beberapa / sub-paket / Util.groovy
example.groovy
Untuk menjalankan
example.groovy
skrip, tambahkan ke jalur sistem Anda dan ketik dari direktori mana pun:Naskah mencetak:
Contoh di atas telah diuji di lingkungan berikut:
Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Contoh tersebut menunjukkan hal berikut:
Util
kelas di dalam skrip yang menarik.Util
kelas memanggilGuava
library pihak ketiga dengan memasukkan sebagaiGrape
ketergantungan (@Grab('com.google.guava:guava:23.0')
).Util
kelas dapat berada di subdirektori.Util
kelas.Komentar / saran tambahan:
new Util()
, tetapi yang paling penting itu harus ditempatkan dalam file bernama apa pun kecuali Util.groovy. Lihat Skrip versus kelas untuk detail lebih lanjut tentang perbedaan antara skrip keren dan kelas keren."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
sebagai ganti"some/subpackage/Util.groovy"
. Ini akan menjamin bahwaUtil.groovy
file akan selalu ditemukan dalam kaitannya dengan lokasi skrip groovy (example.groovy
) dan bukan direktori kerja saat ini. Misalnya, menggunakan"some/subpackage/Util.groovy"
akan menghasilkan pencarian diWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
adalah nama skrip, danMyClass.groovy
merupakan nama kelas. Penamaanmy-script.groovy
akan mengakibatkan error runtime dalam skenario tertentu karena kelas yang dihasilkan tidak akan memiliki nama kelas Java yang valid.sumber