私は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プラグインを使用しています。
よくある落とし穴。タスクにアクションを追加します。そうしないと、構成フェーズでコードが実行されます。アクション付きのサンプルタスク:
task sample << {
}
ご覧のとおり、Exec
タイプを使用するよりもカスタムタスクを作成する必要があります。 commandLine
を2回定義することは有効ではないと思います。
[〜#〜]編集[〜#〜]
this の投稿を読んで、すべてがどのように機能するかについての一般的なアイデアを得ることができます。
あなたはタスク構成とグルーヴィーなコードを混ぜています。タスク定義の本体の一部であるすべてのものは、構成フェーズで実行されます。 task task1 << { code }
は、
task task1 {
doLast {
code
}
}
commandLine
は Exec 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')
}
}
Execが実際に使用されている場合(例CommandLine参照)の@Opal回答を完了するだけです:
task task1 << {
exec {
List<String> arguments = new ArrayList<String>()
//..
commandLine arguments
}
}