2017-03-28 66 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

作品像一個魅力:)謝謝! –