gpt4 book ai didi

gradle - 如何集中Gradlebuild设置?

转载 作者:行者123 更新时间:2023-12-03 05:02:58 25 4
gpt4 key购买 nike

假设我正在使用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插件。

最佳答案

What is a good way to centralize such code so that all projects can use them?


您将需要创建一个 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插件可以像其他任何 Artifact / JAR一样发布。

关于gradle - 如何集中Gradlebuild设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64407629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com