如何解决如何集中Gradle构建设置?
假设我正在使用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插件。
解决方法
什么是集中化这样的代码以便所有项目都可以使用的好方法?
您将要创建一个custom Gradle plugin来保存项目的约定。
如果在本地安装了Gradle,则可以使用Build Init Plugin创建骨架插件项目。本地安装Gradle后,只需在新项目目录中简单运行gradle init
,然后按照提示创建插件项目即可。
作为一个具体示例(假设您如前所述生成了一个插件项目),要应用版本控制约定,插件可以是:
// Plugin's build.gradle.kts
dependencies {
// Add dependency for plugin,GAV can be found on the plugins page:
// https://plugins.gradle.org/plugin/com.palantir.git-version
implementation("com.palantir.gradle.gitversion:gradle-git-version:0.12.3")
}
那么版本约定插件可以是:
import com.palantir.gradle.gitversion.VersionDetails
import groovy.lang.Closure
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
class VersioningConventionsPlugin : Plugin<Project> {
override fun apply(project: Project) {
// Apply plugin to project as you would in the main Gradle build file.
project.pluginManager.apply("com.palantir.git-version")
// Configure version conventions
val projectVersion: String by lazy {
// Gradle generates some Kotlin DSL code on the fly,in a plugin implementation we don't have that.
// So we must convert the DSL to the Gradle API.
val versionDetails: Closure<VersionDetails> = project.extensions.extraProperties.get("versionDetails") as Closure<VersionDetails>
with(versionDetails.call()) {
if (!lastTag.matches("^(?:(?:\\d+\\.){2}\\d+)\$".toRegex())) {
throw GradleException("Tag '$lastTag' doesn't match 'MAJOR.MINOR.PATCH' format")
}
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"
}
}
// Set the version as an extra property on the project
// Accessible via extra["projectVersion"]
project.extensions.extraProperties["projectVersion"] = projectVersion
}
}
由于您的示例使用了Kotlin DSL,所以我举了一个Kotlin示例。完成约定插件的开发工作后,您将发布到诸如Gradle Plugins repository之类的存储库中。如果它是公司内部插件,则将其发布到内部Nexus Repository或类似内部插件。
关注maven-publish
插件的文档,以获取有关发布的更多详细信息。 Gradle插件可以像其他任何工件/ JAR一样发布。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。