2016-08-19 2 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()를 추가로 보였지만, 그 때문에 childA/build.gradle 실행 customPlugin { ... } 전에 오류가 발생합니다. dependsOn, mustRunAfter 및 다른 기술을 사용하여 시도했지만 아무도 원하는 효과가없는 것 같습니다. (아마 수명주기를 완전히 이해하지 못했지만 루트 프로젝트를 구성하고 서브 프로젝트 전에 실행 한 것처럼 보입니다. 루트를 구성한 다음 서브 프로젝트를 구성하고 실행하지 않아야합니까?)

어떻게 얻을 수 있습니까? 각 하위 프로젝트의 버전을 복사/붙여 넣기 또는 상용구없이 많은 리소스 파일에 삽입하십시오.

+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 
내가 그것을 수정하기 전에

첫 번째 옵션은 각 하위 프로젝트를 평가하는

관련 문제