2017-03-28 65 views
2

我想通过Git标签在Gradle中为java-projects实现自动版本控制。目前我正在使用git describe命令来生成版本字符串。版本字符串必须在清单文件中使用,也可以通过编程方式检索。这就是为什么我实现了一种方法将其保存在构建中包含的属性文件中,并且可以通过Java代码读取它。基于Git的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 

我用它在我的构建scrips这样的:

apply from: 'versioning.gradle' 
versioning { 
    versionFile = file('my/ressource/folder/version.properties') 
} 
println(versioning.version) 

一切正常OK 。我遇到的唯一问题是:我使用gradle构建并测试我的代码,然后提交代码并创建一个git标记。如果我现在要求gradle首先打包一个jar文件而不进行清理,它不会将新的version.properties复制到jar文件中,因为它没有注意到该文件已更改。所以我的应用程序显示旧版本。

我能做些什么吗?我如何才能使Gradle注意到版本更改并使用当前的version.properties文件创建一个jar?

+0

看起来您需要让插件更新'project.version'属性,或者在写入时更改jar名称。 – cjstehno

+0

你见过我的回答吗?它解决了问题吗? – Opal

回答

0

你需要做的是为Jar任务配置TaskOutputs(或from),因此,如果事情已经改变了它可以识别并无需调用clean明确地运行。这可以通过以下方式进行:

jar { 
    from versioning.versionFile 
} 

其次。您可以用类似的方式配置writeVersionFile。如果你配置了输入和输出,任务将是可缓存的。它如何改变可以看到here,演示可以找到here

此外,请注意,您的任务现在已在afterEvaluate关闭中创建。这是为什么?因为这是在执行versioning {}扩展后,并且versionFile属性已设置并且可以配置为输出。

你也可以在versioning.gradle文件中配置jar输入。

+0

作品像一个魅力:)谢谢! –