我想通过Git标签在Gradle中为java项目实现自动版本控制。目前我正在使用git describe命令生成版本字符串。版本字符串必须在清单文件中使用,并且还可以以编程方式检索。这就是为什么我实现了一个方法来将它保存在一个属性文件中,该文件包含在构建中并且可以被Java代码读取。
我现在拥有的是这个小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文件中,因为它没有注意到文件已更改。所以我的应用程序显示旧版本。
我能做些什么吗?如何让gradle注意版本更改并使用当前version.properties
文件创建jar?
答案 0 :(得分:0)
您需要做的是为TaskOutputs
任务配置from
(或Jar
),以便它可以识别某些内容是否已更改并在不调用{{1}的情况下运行明确地。这可以通过以下方式完成:
clean
其次。您可以以类似的方式配置jar {
from versioning.versionFile
}
。如果配置输入和输出,则任务将可缓存。可以看到它如何变化here,可以找到一个演示here。
另外,请注意,您的任务现在是在writeVersionFile
关闭中创建的。这是为什么?因为这是在afterEvaluate
扩展执行并且versioning {}
属性设置并且可以配置为输出之后。
您还可以在versionFile
文件中配置jar
输入。