Подтвердить что ты не робот

Как отлаживать файл 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, что делает невозможным установить точки останова в задаче, такой как мой пример выше?

4b9b3361

Ответ 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

  1. Поместите этот простой код туда, где вы хотите разбить: try {throw new RuntimeException('Break');} catch (RuntimeException e) {}
  2. В соответствии с рекомендацией, запустите вашу задачу с помощью gradle mytask -Dorg.gradle.debug=true --no-daemon в командной строке (не нужно делать это в Eclipse)
  3. В Eclipse выполните Run → Add Java Exception Breakpoint, выберите RuntimeException и нажмите "OK"
  4. Снова в Eclipse перейдите в Run → Debug Configurations → Remote Java Application и создайте новую конфигурацию, которая прослушивает localhost:5005. Назовите это как хотите. Выберите проект, который содержит build.gradle вы отлаживаете. Нажмите Apply и Debug
  5. В этот момент выполнение начнется, но будет приостановлено в строке исключения. И затем вы можете начать просматривать свои переменные в представлении "Отладка → Переменные", просматривать трассировку стека, проходить по коду и т.д.
  6. Никакой магии, увы, вы не увидите ничего выделенного в build.gradle но вы можете догадаться, где вы находитесь
  7. Очевидно, что при последующих запусках вам не нужен шаг 3, а в 4 вы можете повторно использовать ранее созданную конфигурацию
  8. Если вы хотите использовать это в нескольких местах, просто создайте метод, используйте другой тип исключения и не стесняйтесь расширять эту идею любым возможным способом.

Например:

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