Как подключить Gradle к пользовательскому EXE и подключить его консольный вывод?
Хотя этот вопрос касается языка C, плагина Gradle C и статического анализатора oldschool C, называемого splint, я считаю, что на этот вопрос может ответить любой гуру Gradle, который понимает, как подключить сборку Gradle к исполняемому процессу.
Это очень просто: я настроил шину локально для анализа исходного кода моего простого C-проекта с помощью следующей командной строки:
splint +never-include -retvalint src/derpus/c/*.c
Я управляю сборкой моего проекта через Gradle (плагин C) и теперь хотел бы запустить статический анализ (шину) в соответствующей точке последовательности сборки (какой бы она ни была).
шину выводит на консоль, и, к сожалению, больше нет. И поэтому я хотел бы посмотреть, смогу ли я "перехватить" этот вывод консоли, проверить наличие определенных ключевых слов ("ошибка", "предупреждение" и т. Д.) И отменить / остановить сборку, если шина жаловалась на что-либо.
И поэтому я пытаюсь решить несколько проблем здесь:
- Как вызвать шину из Gradle, и на соответствующем этапе? Например, всякий раз, когда CodeNarc выполняется (после компиляции? После запуска тестов?), Вероятно, когда будет вызвана шина.
- Как передать правильные аргументы командной строки для шин с этим вызовом?
- Как подключить вывод консоли?
- Как завершить сборку, если вывод консоли содержит определенные ключевые слова?
Моя лучшая попытка на данный момент:
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% уверен, что мой workingDir
а также commandLine
Аргументы неверны, я не уверен, как я могу потерпеть неудачу / остановить сборку изнутри, что if
, и я не уверен, как "позиционировать" это check
Задача возникает перед компиляцией и тестированием.
Есть идеи, Градл Гуру?
1 ответ
workingDir
каталог, в котором должен запускаться этот инструмент, а не там, где он находится. Обычно это каталог проекта. Когда дело доходит до командной строки, попробуйте:
commandLine 'cmd', '/c', '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!"
}
}