如何使用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
下面添加了plugins
和buildscript
块:
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解决,所以我打开了一个问题