首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Kotlin配置AppEngine级插件

如何使用Kotlin配置AppEngine级插件
EN

Stack Overflow用户
提问于 2018-01-29 13:18:09
回答 2查看 2.1K关注 0票数 7

正如在https://cloud.google.com/appengine/docs/standard/java/tools/gradle-reference上记录的那样,AppEngine Gradle插件提供了如下配置:

代码语言:javascript
复制
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设置。

编辑

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

  • 未解决的参考资料:端口
  • 未解决的引用:部署

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

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

EDIT2

在下面添加了pluginsbuildscript块:

代码语言:javascript
复制
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生成的

代码语言:javascript
复制
/**
 * 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)

但老实说,我不知道这会对我有多大帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-29 21:11:56

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

正如您注意到的,插件的Maven坐标可能与插件Id不同。您可以在settings.gradle中使用pluginManagement规范来处理这个问题(安卓插件的一个例子是这里 )。下面是我如何处理这个问题(并将war插件用于最小的应用程序):

build.gradle,kts

代码语言:javascript
复制
plugins {
  id("com.google.cloud.tools.appengine") version "1.3.4"
  `war`
}

settings.gradle

代码语言:javascript
复制
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并仔细阅读它,我在输出中看到了这一点:

代码语言:javascript
复制
/**
 * 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 { ... }代码块将在顶层正确工作。我们只需要根据它的类型来找出它里面能有什么。注意,如果我们使用的是buildscript {}而不是plugins {},那么您必须自己复制/粘贴这些访问器,或者在构建脚本中执行类似extensions.getByType(com.google.cloud.tools.gradle.appengine.core.AppEngineExtension::class)的操作。

通过搜索,您可以找到AppEngineExtension 论GitHub的源代码。不幸的是,它没有任何方法或字段。它基本上被用作“扩展持有者”类,因为其他扩展被添加到它的这里这里 (可能还有其他地方)。这意味着我们需要做一些类转换技巧才能配置这个对象。源代码是IMO真正了解如何访问这类对象的唯一方法。

下面展示了如何配置deploy扩展(即DeployExtension ),以及如何配置run扩展(即RunExtension )。

代码语言:javascript
复制
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被解析为止,所以我打开了问题

票数 7
EN

Stack Overflow用户

发布于 2019-03-09 08:21:57

使用appengine gradle插件2.0版本的类型安全方法:

代码语言:javascript
复制
import com.google.cloud.tools.gradle.appengine.standard.AppEngineStandardExtension

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath("com.google.cloud.tools:appengine-gradle-plugin:2.0.0-rc5")
    }
}

plugins {
    java
    war
    kotlin("jvm") version "..."
}

repositories {
    jcenter()
}
apply {
    plugin("com.google.cloud.tools.appengine")
}

configure<AppEngineStandardExtension> {
    deploy {
        projectId = "..."
        version = "..."
        stopPreviousVersion = true // etc
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48502220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档