Сделать задачу Gradle Sonar Runner зависимой от одной из моих задач

Я пробую новую задачу Sonar Runner, недавно выпущенную в gradle 1.5. Что я хотел бы сделать, так это иметь возможность сделать задачу запуска сонара зависимой от другой задачи, чтобы я мог правильно установить свойства сонара для этого проекта (например, sonar.sources, sonar.binaries, sonar.libraries, sonar.java.source , сонар.java.цель).

В частности, я использую инструмент сборки osgi под названием bnd, который предоставит эти значения при выполнении задачи инициализации ant (обратите внимание, что, хотя я включаю файл bnd build.xml по умолчанию, моя полная сборка действительно выполняется с использованием gradle).

Я думал, что смогу настроить задачу запуска сонара, выполнив это (это многомодульная сборка):

subprojects {
    sonarRunner.dependsOn init
}

В конце концов добавив что-то вроде этого (насколько я понимаю переменные bnd ant):

subprojects {
    sonarRunner {
        sonarProperties {
            property "sonar.java.source", ant.property["project.sourcepath"]
            property "sonar.java.target", ant.property["project.output"]
            property "sonar.sources", ant.property["project.allsourcepath"]
            property "sonar.libraries", ant.property["project.buildpath"]
        }
    }

    sonarRunner.dependsOn init
}

К сожалению, когда я пытаюсь добавить зависимости, я получаю сообщение об ошибке:

* What went wrong:
A problem occurred evaluating root project 'myproject'.
> Could not find property 'init' on project ':com.company.myproject.mymodule'.

Если я попытаюсь сделать так, чтобы sonarRunner зависел от задачи gradle, я получаю следующую ошибку:

* What went wrong:
A problem occurred evaluating root project 'myproject'.
> Could not find method dependsOn() for arguments [task ':gradletask'] on org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated@c4d7c0c.

Я пропустил что-то очевидное здесь? Если бы кто-то мог указать мне в правильном направлении, это было бы большой помощью.


person Gareth    schedule 06.04.2013    source источник
comment
Возможно, было бы лучше объявить исходные каталоги и т. д. на стороне Gradle. В этом случае плагин sonar-runner автоматически использует правильные значения. Обратите внимание, что Gradle также поддерживает bnd через плагин osgi.   -  person Peter Niederwieser    schedule 08.04.2013
comment
Интеграция с ide упрощается с помощью отдельного файла для указания зависимостей, будь то файл ivy, maven или bnd (я указываю свои зависимости в файле bnd, что позволяет мне использовать bndtools в Eclipse). Я считаю, что плагин gradle osgi похож на плагин bnd maven — он использует только функцию создания манифеста bnd.   -  person Gareth    schedule 12.04.2013


Ответы (3)


Файл gradle корневого проекта оценивается перед файлами gradle дочернего проекта, что означает, что init не существует в том месте, где вы пытаетесь к нему обратиться.

Обходной путь, если вы хотите объявить зависимости в корневом проекте, — использовать afterEvaluate, как описано в http://www.gradle.org/docs/current/userguide/build_lifecycle.html попробуйте:

subprojects {
    afterEvaluate{
        sonarRunner.dependsOn init
    }
}

Другим решением было бы добавить зависимость в подпроекты напрямую или путем применения другого корневого файла градиента.

apply from: '../sonardependency.gradle'
person Joachim Nilsson    schedule 06.04.2013
comment
Я отметил вас, как вы решили первую часть моей проблемы (почему init не был найден). Спасибо! Однако это не решило вторую часть (не удалось найти метод для dependOn()). - person Gareth; 07.04.2013
comment
Вы ответили на мой конкретный вопрос, поэтому я дам его вам. - person Gareth; 12.04.2013

Ваша проблема с невозможностью вызвать dependsOn() для задачи sonarRunner связана с тем, что плагин определяет как расширение sonarRunner, так и задачу sonarRunner. Похоже, что расширения имеют приоритет над задачами, когда объекты разрешаются по имени в файле сборки gradle, поэтому ваша трассировка стека указывает, что вы пытаетесь вызвать dependsOn() для экземпляра org.gradle.api.sonar.runner.SonarRunnerExtension_Decorated вместо того, чтобы вызывать его для экземпляра задачи SonarRunner.

Я думаю, что если вы явно извлекли задачу из контейнера задач, все должно быть в порядке:

tasks.sonarRunner.dependsOn init
person erdi    schedule 07.04.2013
comment
Хорошо это или плохо, но обычно плагин предоставляет расширение и задачу с одним и тем же именем. Другими примерами являются плагины IDE и качества кода. - person Peter Niederwieser; 08.04.2013
comment
Спасибо за информацию! Размечена. Хотя это не решает мою проблему. Если я добавлю это в свой блок подпроектов, я получаю Не удалось найти свойство 'sonarRunner' в наборе задач. Когда я запускаю его в своем проекте верхнего уровня, он находит задачу, но не делает то, что мне нужно (я действительно этого хочу для запуска конкретной задачи инициализации в подпроекте перед настройкой свойств сонара для этого подпроекта). - person Gareth; 12.04.2013
comment
Похоже, вы пытаетесь добавить зависимость задачи до того, как применили плагин sonar-runner. Обычно слишком поздно менять конфигурацию во время выполнения задачи, но поскольку блок sonarRunner оценивается лениво (согласно документации), в данном конкретном случае это может сработать. - person Peter Niederwieser; 12.04.2013

Если кому-то интересно, это один из способов получить правильную информацию о bnd в Sonar для каждого подпроекта (я уверен, что есть способы получше):

subprojects {
    afterEvaluate {
        sonarRunner {
            sonarProperties {
                ant.taskdef(resource:"aQute/bnd/ant/taskdef.properties",
                   classpath: "../cnf/plugins/biz.aQute.bnd/biz.aQute.bnd-2.0.0.jar");
                def projectDir = project.rootDir.toString() + "/" + project.name;
                ant.bndprepare(basedir:projectDir,print:"false",top:null);

                def binaries = ant.properties['project.buildpath'].split(':') as ArrayList;
                binaries.remove(0);
                def binariesString = binaries.join(',');
                properties["sonar.java.source"] = ant.properties['javac.source'];
                properties["sonar.java.target"] = ant.properties['javac.target'];
                properties["sonar.binaries"] = ant.properties['project.output'].replace(':',',');
                properties["sonar.sources"] = ant.properties['project.sourcepath'].replace(':',',');
                properties["sonar.libraries"] = binariesString;
            }
        }
    }
}
person Gareth    schedule 11.04.2013
comment
Вы можете удалить afterEvaluate, так как блок sonarRunner в любом случае оценивается лениво (согласно документам). - person Peter Niederwieser; 12.04.2013