我想通过Git标签在Gradle中实现Java项目的自动版本控制。目前,我正在使用git describe命令生成版本字符串。版本字符串必须在 list 文件中使用,并且也可以通过编程方式检索。这就是为什么我实现了一种方法,将其保存在构建文件中包含的属性文件中,并且可以被Java代码读取的原因。
我目前拥有的是这个小Gradle插件(我真的是gradle的新手):
apply plugin: 'java'
apply plugin: VersioningPlugin
class VersioningPlugin implements Plugin<Project> {
private Project project;
private String getVersion() {
def stdout = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'describe', '--tags'
standardOutput = stdout
}
stdout.toString().trim()
}
@Override
void apply(Project project) {
this.project = project
project.extensions.create('versioning', VersioningPluginExtension)
project.versioning.version = getVersion()
project.task('writeVersionFile') {
doLast {
def versionPropsFile = project.versioning.versionFile
def versionProps = new Properties()
versionProps.put('version', getVersion())
versionProps.store(versionPropsFile.newWriter(), null)
}
}
}
}
class VersioningPluginExtension {
File versionFile
String version
}
compileJava.dependsOn writeVersionFile
我在构建脚本中使用它,如下所示:
apply from: 'versioning.gradle'
versioning {
versionFile = file('my/ressource/folder/version.properties')
}
println(versioning.version)
一切正常。我唯一的问题如下:我使用gradle构建和测试我的代码,然后提交代码并创建git标签。如果我现在要求gradle不先清理就打包jar文件,它不会将新的version.properties复制到jar文件中,因为它没有注意到文件已更改。所以我的应用程序显示了旧版本。
有什么我可以做的吗?如何获得通知以注意版本更改并使用当前
version.properties
文件创建一个jar?
最佳答案
您需要做的是为TaskOutputs
任务配置一个from
(或Jar
),以便它可以识别是否已更改并可以运行而无需显式调用clean
。这可以通过以下方式完成:
jar {
from versioning.versionFile
}
其次。您可以用类似的方式配置
writeVersionFile
。如果同时配置输入和输出,则任务将是可缓存的。 here可以看到它的变化方式,here可以找到一个演示。另外,请注意,您的任务现在已在
afterEvaluate
闭包中创建。这是为什么?因为这是在执行versioning {}
扩展并设置versionFile
属性并将其配置为输出之后。您也可以在
jar
文件中配置versioning.gradle
输入。
关于java - Gradle中基于Git的自动版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43074676/