Как отлаживать файл Gradle build.gradle(в отладчике с контрольными точками)?
Есть ли инструмент, который позволит мне установить точки останова в файле build.gradle и выполнить задачи в отладчике?
Примечание. Я считаю, что задаю другой вопрос, кроме похожих вопросов stackoverflow относительно отладки плагинов Gradle, где (предположительно) намерение выполнить пользовательский Groovy или код плагина Java, расположенный в отдельном файле. Я хочу установить точку останова в задаче Gradle в простом файле build.gradle, например...
task example {
println "I want to set a breakpoint here"
}
... так что, когда я запускаю gradle example
, я могу проверить контекст в отладчике.
(Для тех, кто указал бы мне на IntelliJ... хотя сайт JetBrains рекламирует, что они поддерживают отладочные сценарии Gradle в интерфейсе IDEA, AFAICT это неверно, поскольку об этом сообщалось об ошибке в IDEA13 EAP и не было исправлено в IDEA 14. См. Отладка Gradle файлов сборки в Intellij/Android Studio)
Есть ли какой-либо инструмент для отладки, который позволяет мне установить точку останова в файле build.gradle или что-то в DSL Gradle, что делает невозможным установить точки останова в задаче, такой как мой пример выше?
Ответы
Ответ 1
IntelliJ 2018.2 добавил возможность отладки скриптов Gradle аналогично тому, как вы можете запускать/отлаживать другие проекты. Вы можете увидеть объявление в примечаниях к выпуску здесь.
Вот скриншот некоторых документов 2018.2:
![IntelliJ documentation for debugging a Gradle script task]()
Он еще не поддерживает kotlin-dsl
(см. Gradle/kotlin-dsl/Issues/39).
Ответ 2
есть более простой способ:
просто добавьте в свою -Dorg.gradle.debug=true --no-daemon
строку -Dorg.gradle.debug=true --no-daemon
например: gradle nameOfTask -Dorg.gradle.debug=true --no-daemon
Затем вы должны запустить IDE и запустить удаленную отладку с портом localhost 5005, вот и все.
Gradle ждет вас, потому что стандартная опция server = y
org.gradle.debug
Когда установлено значение true, Gradle будет запускать сборку с включенной удаленной отладкой, прослушивая порт 5005. Обратите внимание, что это эквивалентно добавлению -agentlib: jdwp = transport = dt_socket, server = y, suspend = y, address = 5005 для командную строку JVM и приостановит виртуальную машину, пока не будет подключен отладчик.
Ссылка на документы
Ответ 3
Personnaly Я делаю это, когда мне нужно отлаживать скрипты сборки:
Внутри вашего терминала do
export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
Затем запустите свою сборку
gradle clean install
Наконец, добавьте некоторые точки останова и запустите удаленную конфигурацию отладки внутри вашей IDE на порт 5005, и вы хорошо пойдете!
Ответ 4
После прочтения различных ответов здесь, следующие шаги помогут вам отладить build.gradle
чтобы иметь возможность разбивать и исследовать переменные внутри любой пользовательской задачи. Я использую средства удаленной отладки Eclipse
- Поместите этот простой код туда, где вы хотите разбить:
try {throw new RuntimeException('Break');} catch (RuntimeException e) {}
- В соответствии с рекомендацией, запустите вашу задачу с помощью
gradle mytask -Dorg.gradle.debug=true --no-daemon
в командной строке (не нужно делать это в Eclipse) - В Eclipse выполните
Run → Add Java Exception Breakpoint
, выберите RuntimeException
и нажмите "OK" - Снова в Eclipse перейдите в
Run → Debug Configurations → Remote Java Application
и создайте новую конфигурацию, которая прослушивает localhost:5005
. Назовите это как хотите. Выберите проект, который содержит build.gradle
вы отлаживаете. Нажмите Apply
и Debug
- В этот момент выполнение начнется, но будет приостановлено в строке исключения. И затем вы можете начать просматривать свои переменные в представлении "Отладка → Переменные", просматривать трассировку стека, проходить по коду и т.д.
- Никакой магии, увы, вы не увидите ничего выделенного в
build.gradle
но вы можете догадаться, где вы находитесь - Очевидно, что при последующих запусках вам не нужен шаг 3, а в 4 вы можете повторно использовать ранее созданную конфигурацию
- Если вы хотите использовать это в нескольких местах, просто создайте метод, используйте другой тип исключения и не стесняйтесь расширять эту идею любым возможным способом.
Например:
void halt() {
try {
throw new RuntimeException('Break');
} catch (RuntimeException e) {
print('Paused')
}
}
task iterateDeclaredDependencies {
doLast {
Object configs = configurations.all
halt();
print(configs)
}
}
![enter image description here]()
Ответ 5
export GRADLE_OPTS
у меня не работает.
Попробуй это:
1 Добавьте конфигурацию удаленной отладки
![enter image description here]()
2 добавить точку останова в Gradle
![enter image description here]()
3 ./gradlew your task --stacktrace -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
4 Прикрепить отладку в студии
![enter image description here]()
Тогда остановка остановится !!
![enter image description here]()