Gradle Kotlin DSL эквивалент для Groovy DSL «запустить»? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать простую программу JavaFX 11 с Kotlin и Java 11, используя Gradle, следуя инструкциям здесь . Однако на этой странице используется Groovy DSL от Gradle, и я пытаюсь использовать Kotlin DSL. Удивительно, но мои поиски в Google не обнаружили документ, который сопоставляет каждую конструкцию Groovy с ее эквивалентной конструкцией Kotlin или объясняет в целом, как преобразовать код Groovy DSL в эквивалентный код Kotlin DSL. (Это кажется большим упущением в документации Gradle!).

В частности, этот документ содержит следующий код Groovy:

compileJava {
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
            '--add-modules', 'javafx.controls'
        ]
    }
}

run {
     doFirst {
         jvmArgs = [
             '--module-path', classpath.asPath,
             '--add-modules', 'javafx.controls'
         ]
    }
}

Насколько я могу судить, котлинский эквивалент первой части выглядит так:

tasks.withType<JavaCompile> {
    options.compilerArgs.addAll(arrayOf(
        "--module-path", classpath.asPath,
        "--add-modules", "javafx.controls"
    ))
}

Однако я не смог выяснить, что такое Kotlin DSL, эквивалентный второй части. Обратите внимание, что «run» является стандартным расширением функции в стандартной библиотеке Kotlin, поэтому не похоже, что версия Kotlin этого кода может использовать имя «run» для той же цели в Kotlin DSL.

(Примечание: я рассмотрел попытку использовать плагин для поддержки JavaFX (как описано, например, на этой странице), но плагин кажется довольно сложным в использовании, и у меня уже есть достаточно проблем из-за ряда сложностей в этом проекте, которые я не решаюсь представить очень легко документированный плагин с открытым исходным кодом в миксе.Я действительно пытаюсь создать самую простую из возможных программ "Hello, World" на JavaFX / Gradle на данный момент и до сих пор это казалось удивительно трудным.)

Буду признателен за любую помощь.

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Используя API избегания конфигурации, эквивалент второго блока:

tasks.named<JavaExec>("run") {
    doFirst {
        jvmArgs = listOf("--module-path", classpath.asPath,"--add-modules", "javafx.controls")
    }
}

Ключ в том, что прогон имеет тип JavaExec, который, как и любой тип задачи, может быть обнаружен путем создания задачи для печати класса задачи, которую вы затем запускаете:

tasks.register("getName") {
    doFirst {
        print("Class name: ${tasks["run"].javaClass}")
    }
}

Обратите внимание, что по мере роста вашего приложения JavaFX вам нужно будет указывать дополнительные модули, например:

tasks.named<JavaExec>("run") {
    doFirst {
        jvmArgs = listOf("--module-path", classpath.asPath,
            "--add-modules", "javafx.base,javafx.controls,javafx.graphics")
    }
}
0 голосов
/ 01 декабря 2018

С Gradle 5.0 и kotlin-dsl 1.0, задачи, которые зарегистрированы или созданы плагинами, могут быть статически доступны через контейнер tasks (TaskContainer. Этот пример представлен в примечания к выпуску :

plugins {
    java
}

tasks {
    named<Test>("test") {
        testLogging.showStacktraces = true
    }
}

Теперь вы можете написать:

plugins {
    java
}

tasks {
    test {
        testLogging.showStacktraces = true
    }
}

Для вашего примера вы, скорее всего, используете плагин application, который регистрирует задачу run, чтобы вы могли настроить ее аналогичным образом. Следует помнить, что run конфликтует с методом Kotlin stdlib run, поэтому вам нужно применить какой-то обходной путь, чтобы убедиться, что он вызывается (см. gradle / kotlin-dsl / вопросы / 1175 )

tasks {
  compileJava {
    doFirst {
      jvmArgs = listOf("--module-path", classpath.asPath,
          "--add-modules", "javafx.base,javafx.controls,javafx.graphics")
    }
  }

  (run) {
    doFirst {
      jvmArgs = listOf(
        "--module-path", classpath.asPath,
        "--add-modules", "javafx.controls"
      )
    }
  }
}

Другие ответы показывают, как вы можете использовать имя, тип или комбинацию для запроса контейнера для определенных задач.

0 голосов
/ 02 ноября 2018

Удивительно, но мои поиски в Google не обнаружили документ, который сопоставляет каждую конструкцию Groovy с ее эквивалентной конструкцией Kotlin или объясняет в целом, как преобразовать код Groovy DSL в эквивалентный код Kotlin DSL.

Пожалуйста, посмотрите на https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/ и ESP. Настройка задач раздел. В соответствии с этим, я бы сказал, что эквивалент Kotlin DSL составляет

tasks.named<JavaExec>("run").doFirst {
    jvmArgs = listOf('--module-path', classpath.asPath, '--add-modules', 'javafx.controls')
}
...