10

私は Gradle を使用するのが初めてで、バージョン番号の管理に役立つプラグインを開発しようとしています。このプラグインは、project.version適用先のプロジェクトのプロパティを設定するタスクを定義します。

私がやろうとしているのは、このプロパティがすべての Gradle ビルドの開始時に設定されるようにすることです。別のGradleの質問に対するPeterの回答を使用しgradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNamesて、プラグインのapplyメソッド内に追加することで、タスクを他のタスクよりも先に実行することができました。

ただし、他のプラグイン (特に「Maven-publish」) は、構成フェーズで指定されているバージョンに依存しています。

publishing {
    publications {
        somePublication(MavenPublication) {
            version = project.version
        }
    }
}

私が知りたいのは、versionこれらの拡張機能内のようなプロパティの評価を可能な限り遅延させる方法があるかどうかです。この場合、それらに依存するタスクが呼び出されるまで評価されません。かもしれません:publishToMavenLocal

以下は、私が達成したいことを示す SSCCE です。

// This would be included within the plugin
class SetProjectVersionNumber extends DefaultTask {

    @TaskAction
    void start() {
        // This will set project.version during execution phase
        project.version = "1.2.3"
        logger.info "Set project version number: $project.version"
    }
}

task setProjectVersionNumber(type: SetProjectVersionNumber)

// Imagine this block being replaced by a maven 'publishing' block (or something similar)
ext {
    version = project.version

    // This will print 'unspecified', as it's evaluated during configuration phase
    println "In extension, setting version=$project.version"
}

ext.version上記の例で同等にする方法を提供できれば1.2.3、私の問題は解決したと思います。

これがあまりにも多くのことを要求している場合は、実行時ではなく構成時にプラグインにバージョン文字列を生成させることができるかもしれません。でも、このようにできるかどうかを知っておくといいでしょう。

編集

実験的なブランチで、すべてのバージョン文字列の割り当てロジックを構成フェーズに移動しようとしました (タスクの実行中ではなく、プラグインの適用中にすべてを実行することによって) が、プラグインの拡張機能が機能していないため、これが機能するとは考えていません。まだ処理されていないため、その中で定義されたプロパティを参照しようとすると失敗します。

編集2

バージョン文字列の割り当てロジックをproject.afterEvaluateクロージャーでラップすると、うまくいったようです。

@Override
public void apply(Project project) {
    logger = project.logger
    project.extensions.create(EXTENSION_NAME, SemVerPluginExtension)

    project.afterEvaluate {
        setVersionProjectNumber(project)
        addTasks(project)
    }
}

モック プロジェクトでは、次のように実装build.gradleします。

apply plugin: 'semver'
apply plugin: 'maven-publish'

group = 'temp'

buildscript {
    repositories {
        mavenLocal()
        jcenter()
    }
    dependencies {
        classpath 'com.github.tagc:semver-plugin:0.2.2'
    }
}

semver {
    versionFilePath = 'version.properties'
}

publishing {
    publications {
        testPublication(MavenPublication) {
            version = project.version
            assert version
            println "Set publication version to $version"
        }
    }
}

何らかの理由で、これはうまくいくようです。バージョン文字列の割り当てロジックは 'afterEvaluate' クロージャーでラップされ、テスト パブリケーションのバージョン割り当てはそうではありませんが、前者は後者の前に発生します。

Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using StatementExtractingScriptTransformer.
Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using BuildScriptTransformer.
VERSION FILE PATH=version.properties
Current Git branch: develop
Set project version to 0.2.1-SNAPSHOT
Set publication version to 0.2.1-SNAPSHOT
All projects evaluated.

当初の意図どおりにできるかどうか知りたいので、この質問は未解決のままにしておきます。さらに、プロジェクト バージョンが設定された後にパブリケーション バージョンが割り当てられる理由と、それが常に当てはまるのか、それとも偶然に起こっているのかについて、説明をいただければ幸いです。

4

1 に答える 1