Динамическая настройка задачи в родительском build.gradle - PullRequest
4 голосов
/ 23 марта 2012

У меня есть мультипроектная сборка C ++ Gradle, которая производит несколько библиотек и исполняемых файлов. Я пытаюсь получить исполняемые (но не библиотеки) подпроекты для компиляции с помощью объекта «отпечаток». Это прекрасно работает, если я добавлю что-то подобное в отдельные подпроекты 'build.gradle:

compileMain.doFirst {
    // code to generate a 'BuildInfo.cpp' from from a template.
    // embeds name of executable in so has to be generated anew for each exe
}

Следуя принципам СУХОГО, я бы предпочел сделать это раз и навсегда на верхнем уровне build.gradle. Это моя попытка применить его только к подпроектам, которые используют плагин cpp-exe, следуя этим инструкциям :

configure(subprojects.findAll { it.plugins.hasPlugin('cpp-exe') }) {
    compileMain.doFirst {
       // same code as above
    }
}

Увы, это не срабатывает. Однако, если я помещу что-то вроде этого в менее строгий блок configure, это показывает, что идея запроса плагина должна работать:

configure(subprojects.findAll { true }) { 
    task mydebug << {
        if ( project.plugins.hasPlugin( 'cpp-exe' ) ) {
            println ">>> $project.name has it!"
        }
    }
}

Может ли быть так, что плагины не применяются к подпроектам во время оценки закрытия configure (на верхнем уровне build.gradle)? Может быть, есть гораздо более простой способ достичь этого вообще?

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Вы, вероятно, применяете плагин cpp-exe в сценариях сборки дочерних проектов. По умолчанию родительский скрипт сборки оценивается раньше, чем его потомки, что объясняет, почему он не находит ни одного проекта, к которому применен cpp-exe.

Есть несколько способов решить эту проблему. Один из способов - перенести всю конфигурацию, специфичную для проекта cpp-exe (например, применить плагин и добавить действие), в одно место. Либо вы делаете всю такую ​​конфигурацию из родительского сценария сборки (например, перечисляя подпроекты cpp-exe и настраивая их с помощью одного configure(cppExeProjects) { ... }), либо перемещаете конкретную конфигурацию cpp-exe в свой собственный сценарий сборки (скажем, * 1006). *) и применить его к выбранным подпроектам следующим образом: apply from: "$rootDir/gradle/cpp-exe.gradle".

Другое решение - изменить порядок оценки сценариев сборки. Но я бы использовал это только в крайнем случае, и это, конечно, не нужно здесь.

1 голос
/ 05 апреля 2013

Gradle 1.5 недавно вышел, я не уверен, что это новая функция, но, как она выглядит, вы можете решить проблему, используя afterEvaluate .Взгляните на раздел 53.6.1 в http://www.gradle.org/docs/current/userguide/build_lifecycle.html

Что-то вроде:

subprojects {subProject ->
  afterEvaluate {
    if ( subProject.plugins.hasPlugin('cpp-exe')){
      println "Project $subProject.name has plugin cpp-exe"
    }
  }
}

даст вам старт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...