Как подключить 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!"
    }
}
Другие вопросы по тегам