【发布时间】:2020-10-17 21:39:35
【问题描述】:
假设我正在使用palantir/gradle-git-version Gradle 插件,并在build.gradle.kts 中有以下代码来确定项目版本:
// If release branch, return after incrementing patch version.
// Else, return $lastTag-SNAPSHOT.
val projectVersion: String by lazy {
val versionDetails: groovy.lang.Closure<VersionDetails> by extra
with(versionDetails()) {
if (!lastTag.matches("^(?:(?:\\d+\\.){2}\\d+)\$".toRegex())) {
throw GradleException("Tag '$lastTag' doesn't match 'MAJOR.MINOR.PATCH' format")
}
// If it detached state, get branch name from GitLab CI env var
val branch = branchName ?: System.getenv("CI_COMMIT_REF_NAME")
if (branch?.startsWith("release/") == true) {
val tokens = lastTag.split('.')
"${tokens[0]}.${tokens[1]}.${tokens[2].toInt() + commitDistance}"
} else "$lastTag-SNAPSHOT"
}
}
这可行,但代码在所有项目中重复,除了极少数项目外,很难维护。
这只是一个示例,同样适用于其他在公司/团队中采用某些约定的 Gradle 任务,例如创建Dockerfile。
有什么好的方法可以集中这些代码以便所有项目都可以使用它们?请注意,这样的代码通常不会独立存在,而是依赖于 Gradle 插件。
【问题讨论】:
-
我当前的团队将构建的所有(公共)部分维护为应用到团队所有项目的 Gradle 插件。 Gradle 插件可以包含几乎相同的内容,您可以放入构建文件本身,从属性和任务声明到应用整个其他插件。我认为这也可能是这种情况下的一个选项 - 从版本处理开始,如果需要则扩展
-
@RolandKreuzer 我知道 Gradle 插件声明了新任务,但没有声明新属性;我也不清楚 Gradle 插件如何传递应用其他插件。您可以在删除专有信息后使用您引用的插件的 sn-p 发布答案吗?
标签: gradle build.gradle gradle-plugin gradle-kotlin-dsl