この質問には、C 言語、Gradle C プラグイン、およびsplintと呼ばれる古い学校のC 静的アナライザーが含まれますが、この質問は、Gradle ビルドを実行可能プロセスに接続する方法を理解している Gradle の第一人者なら誰でも答えることができると思います。
それは非常に簡単です: 次のコマンド ラインを使用して、単純な C プロジェクトのソース コードを分析するために splint をローカルに構成しました。
splint +never-include -retvalint src/derpus/c/*.c
Gradle (C プラグイン) を介してプロジェクトのビルドを管理しており、ビルド シーケンスの適切な時点で静的解析 (スプリント) を呼び出したいと考えています (それが何であれ)。
splint はコンソールに出力されますが、残念ながら他の場所には出力されません。したがって、このコンソール出力を「フック」し、特定のキーワード (「エラー」、「警告」など) をチェックし、スプリントが何かを訴えた場合にビルドを失敗/停止できるかどうかを確認したいと思います。
そして、私はここでいくつかの問題に取り組もうとしています:
- Gradleからスプリントを呼び出す方法、および適切な段階で? たとえば、CodeNarc が実行されるたびに (コンパイル後? テストの実行後?)、スプリントが呼び出される可能性が高くなります。
- この呼び出しで正しいコマンドライン引数を splint に渡す方法は?
- splint のコンソール出力をフックする方法は?
- コンソール出力に特定のキーワードが含まれている場合にビルドを失敗させる方法は?
これまでの私の最善の試みは次のとおりです。
task check(type:Exec) {
commandLine 'cmd', '/c', 'C:/splint-3.1.1/bin/splint.exe', '+never-include', '-retvalint', 'src/derpus/c/*.c'
standardOutput = new ByteArrayOutputStream()
doLast {
String output = standardOutput.toString()
if(output.contains("error") || output.contains("")) {
println "Chuggington!"
} else {
println "Meeska! Mooseka! Mickey Mouse! Output is: ${output}"
}
}
}
これにより、次が生成されます。
Defining custom ▒check▒ task is deprecated when using standard lifecycle plugin has been deprecated and is scheduled to be removed in Gradle 3.0
:checkSplint 3.1.1 --- 12 April 2003
Finished checking --- no warnings
Chuggington!
BUILD SUCCESSFUL
Total time: 3.327 secs
しかし、私は 100% 自信を持って myworkingDir
とcommandLine
args が間違っていると確信しています。その -statement 内からビルドを失敗/停止する方法がわかりません。また、このタスクをコンパイル前に実行するif
ように「配置」する方法もわかりません。check
テスト。
アイデアはありますか、グラドルの達人ですか?