如何使用Kotlin DSL配置AppEngine Gradle插件

正如https://cloud.google.com/appengine/docs/standard/java/tools/gradle-reference中所述,AppEngine Gradle插件提供的配置如下所示:

appengine { // App Engine tasks configuration run { // local (dev_appserver) configuration (standard environments only) port = 8080 // default } deploy { // deploy configuration stopPreviousVersion = true // default - stop the current version promote = true // default - & make this the current version } } 

如何使用build.gradlke.kts这样的配置看起来像?

我正在查看AppEngine任务,但不明白将此连接到适当的Kotlin DSL设置。

编辑

当简单地将上面的块添加到build.gradle.kts IntelliJ抱怨与:

  • 未解决的参考:端口
  • 未解决的参考:部署

当从cml运行Gradle时,我得到:

无法打开缓存目录azhqxsd1d4xoovq4o5dzec6iw(/Users/test/.gradle/caches/4.5/gradle-kotlin-dsl/azhqxsd1d4xoovq4o5dzec6iw)。 内部错误:无法编译脚本,请参阅日志以获取详细信息

EDIT2

下面添加了pluginsbuildscript块:

 val kotlinVersion = property("kotlin.version") val javaVersion = "1.8" buildscript { repositories { jcenter() mavenCentral() mavenLocal() maven("https://plugins.gradle.org/m2/") maven("https://repo.spring.io/milestone") maven("https://repo.spring.io/snapshot") } dependencies { classpath("com.google.cloud.tools:appengine-gradle-plugin:1.3.4") classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } apply { plugin("com.google.cloud.tools.appengine") plugin("org.springframework.boot") } plugins { val kotlinVersion = "1.2.0" `war` `idea` id("org.jetbrains.kotlin.jvm") version kotlinVersion id("org.jetbrains.kotlin.kapt") version kotlinVersion id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion id("org.jetbrains.kotlin.plugin.noarg") version kotlinVersion id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion id("com.ewerk.gradle.plugins.querydsl") version "1.0.9" id("io.spring.dependency-management") version "1.0.3.RELEASE" } 

EDIT3

我看到这是由kotlinDslAccessorsReport生成的:

 /** * Retrieves the [appengine][com.google.cloud.tools.gradle.appengine.core.AppEngineExtension] project extension. */ val Project.`appengine`: com.google.cloud.tools.gradle.appengine.core.AppEngineExtension get() = extensions.getByName("appengine") as com.google.cloud.tools.gradle.appengine.core.AppEngineExtension /** * Configures the [appengine][com.google.cloud.tools.gradle.appengine.core.AppEngineExtension] project extension. */ fun Project.`appengine`(configure: com.google.cloud.tools.gradle.appengine.core.AppEngineExtension.() -> Unit): Unit = extensions.configure("appengine", configure) 

但老实说,我不知道这可以帮助我进一步。

为了使kotlin-dsl在编译时间之前为应用插件生成静态访问器,您必须使用plugins {}块而不是buildscript {}块。 buildscript {}仍然会使脚本类路径显示依赖关系,但是不会得到这些依赖关系。

正如你注意到的,插件的Maven坐标可能与插件ID不同。 你可以在settings.gradle使用pluginManagement规范来处理这个问题(这里是Android插件的一个例子,下面是我如何处理这个问题(和使用war插件进行最小程度的应用):

build.gradle,kts

 plugins { id("com.google.cloud.tools.appengine") version "1.3.4" `war` } 

settings.gradle

 pluginManagement { repositories { gradlePluginPortal() google() } resolutionStrategy { eachPlugin { if (requested.id.id == "com.google.cloud.tools.appengine") { useModule("com.google.cloud.tools:appengine-gradle-plugin:${requested.version}") } } } } 

现在,我已经应用了插件, kotlin-dsl将在脚本编译之前生成访问器。

运行./gradlew kotlinDslAccessorsReport并通过它./gradlew kotlinDslAccessorsReport我在输出中看到这一点:

 /** * Retrieves the [appengine][com.google.cloud.tools.gradle.appengine.core.AppEngineExtension] project extension. */ val Project.`appengine`: com.google.cloud.tools.gradle.appengine.core.AppEngineExtension get() = extensions.getByName("appengine") as com.google.cloud.tools.gradle.appengine.core.AppEngineExtension /** * Configures the [appengine][com.google.cloud.tools.gradle.appengine.core.AppEngineExtension] project extension. */ fun Project.`appengine`(configure: com.google.cloud.tools.gradle.appengine.core.AppEngineExtension.() -> Unit): Unit = extensions.configure("appengine", configure) 

现在,您可以看到appengine { ... }代码块将在顶层正常工作。 我们只需要根据它的types找出它里面的东西。 请注意,如果我们使用的是buildscript {}而不是plugins {} ,则必须自己复制/粘贴这些访问器,或者执行诸如extensions.getByType(com.google.cloud.tools.gradle.appengine.core.AppEngineExtension::class)在您的构建脚本。

做一些搜索,你可以在GitHub上findAppEngineExtension的源代码。 不幸的是,它没有任何方法或领域。 它基本上被用作“扩展持有者”类,在这里和这里 (可能还有其他地方)添加了其他扩展。 这意味着我们需要做一些类投技巧来配置这个对象。 源代码是IMO真正想出如何访问这些types的对象的唯一方法。

下面显示了我们如何配置deploy扩展(这是一个DeployExtension以及如何配置run扩展( RunExtension

 import com.google.cloud.tools.gradle.appengine.core.DeployExtension import com.google.cloud.tools.gradle.appengine.standard.RunExtension appengine { ((this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("run") as RunExtension).apply { port = 8080 } ((this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("deploy") as DeployExtension).apply { stopPreviousVersion = true // default - stop the current version promote = true } } 

有几种不同的方式来完成上述,但这是我采取的方法。 插件本身应该提供更友好的配置方法,直到kotlin-dsl / 457解决,所以我打开了一个问题