我正在部署一个符合 Google 应用引擎标准的应用程序。这是一个 Java/Kotlin 应用程序,但问题不一定是特定于此的。我正在使用最新的 Gradle 插件,答案可能是特定于此的。
就像这些年来一样,我指定了一个项目 ID,比如说 MyProject,以及版本号/字符串,比如说 1-2-0。历史上,这两条信息都会进入
appengine-web.xml
文件(对于 Python 为 app.yaml
)。它们仍然可以在那里设置,但随后会被忽略,正如部署过程所明显指出的那样。
项目 ID MyProject 现在必须指定为通用 glcoud 命令行界面配置的一部分(可以通过
gcloud config configurations list
查看)。 Gradle 插件似乎可以很好地从那里获取它。
对于版本1-2-0,但是,我不知道在哪里以及如何设置它。因此,在部署时,我总是会得到像
20170604t124930
这样的新默认值,以及许多冗余的应用程序版本。
对于我之前使用
appcfg
(或者是 glcoud
命令?)进行部署的 Python 应用程序,我将项目 ID 和版本指定为命令行参数。 Gradle 插件必须在其他地方找到(或没有找到)此信息。 Gradle 文件的 version = '1.2.0-SNAPSHOT'
当然只是针对生成的 jar/war。网络上的许多建议、官方 Google 文档(!)和这个网站像这里都是过时的、矛盾的,或者两者兼而有之(因此,请原谅我冗长、相当详细的帖子)。谢谢!
简单的答案可以在 App Engine Gradle 插件任务和属性 的底部找到。只需将其添加到
build.gradle
:
appengine.deploy.version = '1-2-0'
或者,作为更广泛的应用程序引擎插件配置的一部分:
appengine {
deploy {
...
version = '1-2-0
}
}
我的困惑似乎源于这样一个事实:有旧的 Gradle 插件和新的插件,并且 两者之间的处理确实发生了很大的变化。特别是,新插件更依赖于
glcoud
配置。该插件按原样允许在 Gradle 配置中设置项目 ID (appengine.deploy.project
),但是,当未在那里指定时,仅从可用项目列表中获取默认值(命令行:gcloud config list project
- 旧的appcfg
不再使用)。
但是,当 Gradle 配置中缺少版本时,环境中的版本没有这样的默认值。在这种情况下,每次部署都会采用新的时间戳字符串。
你可以写 在 gradle.properties 里面
projectVersion=1.0
以及 build.gradle 内部
allprojects {
def hash = 'git rev-parse --short HEAD'.execute().text.trim() //tag
version = "$projectVersion.$hash"
}