Pertanyaan: bagaimana cara mengeksekusi kumpulan file kotlin saat runtime dan mengembalikan hasil dari satu file kts dari mereka?

Saya menulis sistem, yang mampu mengeksekusi file kts dengan instruksi. Untuk saat ini mendukung skema eksekusi berikut:

main.kts - file ini akan dieksekusi. Itu harus mengembalikan List<Step>

Namun pengguna dapat meletakkan file lain di folder yang sama. Misalnya, folder dapat memiliki file berikut:

  • main.kts
  • Constants.kt // memiliki beberapa konstanta
  • Helpers.kt // beberapa metode tambahan

ScriptEngine memiliki metode untuk mengevaluasi kode, namun hanya memiliki satu file input.

Pertanyaan: bagaimana saya bisa meminta ScriptEngine untuk mengkompilasi kelas ke dalam classpath, namun hanya menjalankan salah satunya?

Solusi ini tidak benar, karena urutan file penting (mis. kompilasi gagal jika file pertama bergantung pada yang terakhir):

// there is security issue here
val classLoader = Thread.currentThread().contextClassLoader

val engineManager = ScriptEngineManager(classLoader)

setIdeaIoUseFallback()

val ktsEngine: ScriptEngine = engineManager.getEngineByExtension("kts")

/**
 * There is issue here: if file1 requires file2 compilation then execution below fails.
 *
 * Right way: find the solution to compile whole folder and evaluate the single file.
 */
filesFromFolderExceptMain.forEach {
    ktsEngine.eval(it)
}

return ktsEngine.eval(mainScriptFile) as List<Step>

Solusi lain (yang dapat menyebabkan fluktuasi kompilasi yang tidak terduga):

val context = filesFromFolderExceptMain.joinToString(System.lineSeparator()

ktsEngine.eval(context)

return ktsEngine.eval(mainScriptFile) as List<Step>

Jadi, pertanyaan: bagaimana cara mengeksekusi kumpulan file kotlin saat runtime dan mengembalikan hasil dari satu file kts dari mereka?

1
Manushin Igor 10 Maret 2020, 16:39

1 menjawab

Jawaban Terbaik

Yang seharusnya Anda lakukan adalah menambahkan @file:Import("Constants.kt", "Helpers.kt") ke skrip utama (lihat https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md#kotlin-main-kts). Meskipun saya tidak yakin apakah itu relatif terhadap direktori tempat skrip berada atau ke direktori kerja.

Jika Anda tidak ingin pengguna melakukan itu, Anda dapat meneruskannya di importedScripts.

0
Alexey Romanov 10 Maret 2020, 13:57