web-dev-qa-db-ja.com

Gradleタスクは自動的に実行されるべきではありません

私はgradleでタスクを定義しています:

task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('Android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "Android:versionCode=\"([0-9]+)\"", "Android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')

    commandLine 'git', 'diff'
}

明示的にgradle releaseCandidateとして呼び出す場合にのみ実行したいもの。 ただし、gradle assembleDebugなどの他のタスクを実行すると、タスクreleaseCandidateも実行されます。そのような動作をさせたくありません。 releaseCandidateまたはその逆に依存するタスクはありません。

私のプロジェクトはAndroidアプリなので、Android gradleプラグインを使用しています。

27
André Staltz

よくある落とし穴。タスクにアクションを追加します。そうしないと、構成フェーズでコードが実行されます。アクション付きのサンプルタスク:

task sample << {
}

ご覧のとおり、Execタイプを使用するよりもカスタムタスクを作成する必要があります。 commandLineを2回定義することは有効ではないと思います。

[〜#〜]編集[〜#〜]

this の投稿を読んで、すべてがどのように機能するかについての一般的なアイデアを得ることができます。

50
Opal

あなたはタスク構成とグルーヴィーなコードを混ぜています。タスク定義の本体の一部であるすべてのものは、構成フェーズで実行されます。 task task1 << { code }は、


task task1 {
  doLast {
    code
  }
}

commandLineExec Task の一部ですが、他のコードは含まれておらず、doLastにラップする必要があります。これにより、最初にコマンドラインが実行され、次に追加のコードが実行されます。別のexec commandLineが必要な場合は、別のタスクが必要になります。


task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    doLast {
    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('Android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "Android:versionCode=\"([0-9]+)\"", "Android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')
    }
}
16

Execが実際に使用されている場合(例CommandLine参照)の@Opal回答を完了するだけです:

task task1 << {
   exec {
        List<String> arguments = new ArrayList<String>()
        //..
        commandLine arguments
   }
}
1