0

現在、プロジェクトをantからgradleに移行しています。すべて問題ありませんが、1 つだけ問題があります。現在、レポで git コマンドを実行して最新の xy-release タグを読み取り、バージョン番号を取得するためのカスタム ant-contrib ベースのタスクがあります (およびプロジェクトのような生成された jar ファイル名のバージョンを取得します) xy.jar)。ご覧のとおり、これにはプラグインが必要です。悲しいことに、利用可能なプラグインを調べても、実際には何も役に立ちません (いくつかの git 関連のプラグインは存在しますが、それらの目標は、リリースを作成するなどの別の目的であるため、既に作成されたタグを読み取るのではなく、リポジトリにタグを付けます)。だから私は私の目標を達成するために助けが必要です. Gradle ですべてを発明する必要がありますか? 既存の ant ビルド ファイルをインポートできることはわかっていますが、実際にはインポートしたくありません。

4

3 に答える 3

2

さて、Gradle で同じ古いものを実装しようとしました。(アリ/ツタから逃げているので、古いものを保持したくないため)。これが出力です(私はGradleとGroovyが初めてなので、不自由かもしれません)。できます。

jar {
    dependsOn configurations.runtime

    // get the version
    doFirst {
        new ByteArrayOutputStream().withStream { execOS ->
            def result = exec {
                executable = 'git'
                args = [ 'describe', '--tags', '--match', '[0-9]*-release', '--dirty=-dirty' ]
                standardOutput = execOS
            }

            // calculate version information
            def buildVersion = execOS.toString().trim().replaceAll("-release", "")
            def buildVersionMajor = buildVersion.replaceAll("^(\\d+).*\$", "\$1")
            def buildVersionMinor = buildVersion.replaceAll("^\\d+\\.(\\d+).*\$", "\$1")
            def buildVersionRev = buildVersion.replaceAll("^\\d+\\.\\d+\\.(\\d+).*\$", "\$1")
            def buildTag = buildVersion.replaceAll("^[^-]*-(.*)\$", "\$1").replaceAll("^(.*)-dirty\$", "\$1")
            def dirty = buildVersion.endsWith("dirty")

            println("Version: " + buildVersion)
            println("Major: " + buildVersionMajor)
            println("Minor: " + buildVersionMinor)
            println("Revision: " + buildVersionRev)
            println("Tag: " + buildTag)
            println("Dirty: " + dirty)

            // name the jar file
            version buildVersion
        }
    }

    // include dependencies into jar
    def classpath  = configurations.runtime.collect { it.directory ? it : zipTree(it) }
    from (classpath) {
        exclude 'META-INF/**'
    }

    // manifest definition
    manifest {
        attributes(
            'Main-Class': 'your.fancy.MainClass'
        )
    }
}
于 2012-09-27T13:06:35.593 に答える
1

または、既存の Ant タスクを再利用します。Ant ビルドをインポートする必要はありません。

于 2012-09-26T15:20:36.460 に答える
0

git にはこのためのコマンドがあるのでgit describe、それはかなり簡単なはずです。git を呼び出して、出力を読み取るだけです。最後の *-release タグだけを取得するには、正確なコマンドは次のとおりです。

git describe --abbrev=0 --match=*-release

(正規表現かグロブかはわかりません。正規表現の場合は が必要です.*-release)。--tagsリリース タグに注釈が付けられていない場合に追加します。

于 2012-09-26T14:18:11.890 に答える