2016-08-19 88 views
0

我有一个多项目Gradle构建,其中子项目被分配独立于根项目的版本号。我想将这个版本号注入每个子项目的几个资源文件中。通常情况下,我会通过在根构建中为每个子项目配置processResources任务来完成此任务。然而,问题在于,在加载子项目的构建文件之前,Gradle似乎正在执行processResources任务,并且正在注入“未指定”作为版本。在配置子项目后执行Gradle任务

目前,我的项目是这样的:

/settings.gradle

include 'childA' // ... and many others 

/build.gradle

subprojects { 
    apply plugin: 'java' 
    apply plugin: 'com.example.exampleplugin' 
} 

subprojects { 
    // This has to be configured before processResources 
    customPlugin { 
     baseDir = "../common" 
    } 

    processResources { 
     // PROBLEM: version is "unspecified" here 
     inputs.property "version", project.version 

     // Inject the version: 
     from(sourceSets.main.resources.srcDirs) { 
      include 'res1.txt', 'res2.txt', 'res3.txt' 
      expand 'version':project.version 
     } 
     // ... 
    } 
} 

/childA/build.gradle

version = "0.5.424" 

我看着在根的build.gradle的开头添加evaluationDependsOnChildren(),但会导致一个错误,因为customPlugin { ... }childA/build.gradle运行。我尝试过使用dependsOn,mustRunAfter和其他技术,但没有一个看起来有理想的效果。 (也许我不完全了解生命周期,但是似乎在子项目之前配置并执行了根项目,不应配置root,然后配置子项目,然后执行?)

我该如何获得将每个子项目的版本注入适当的资源文件中,而不需要大量的复制/粘贴或样板文件?

+0

你有没有想过这个?你可以做的一件事就是调用project.subprojects {sub - > sub.evaluate() //在子项目被评估后把代码放在这里}但是我试图在不改变评估逻辑的情况下做到这一点,所以如果你想出另一个解决方案我很乐意听到它 – BoredAndroidDeveloper

回答

1

试着做这样的:

subprojects { project -> 
    // your code 
} 

否则project将把这里没有指定版本的根项目。

+1

尝试过,但是Gradle说'项目'没有属性,尽管我在子项目中设置它们。 – Wrench

1

我明白了我的想法。我正在使用init.gradle文件将某些内容应用到rootProject,但我需要来自子项目的数据。

第一种选择是评价各子项目之前,我修改了它:

rootProject { 
    project.subprojects { sub -> 
     sub.evaluate() 
     //Put your code here 

但我不知道效果迫使子项目评估会有什么副作用,所以我做了以下内容:

allprojects { 
    afterEvaluate { project -> 
     //Put your code here 
相关问题