2016-12-02 2 views
1

하위 프로젝트가있는 프로젝트가 있습니다. 레이아웃 :
--subproj1
---- mybuild.number
--subproj2
--build.gradle
--gradle.properties
--settings.gradleGradle 프로젝트, 반복적으로 실행되는 하위 프로젝트

rootproj

mybuild.number

#Build Number for ANT. Do not edit! 
#Wed Nov 210 2121:210:2121 PST 2102121 
build.number=1 

settings.gradle

include ('subproj1', 'subproj2') 

build.gradle

allprojects { 

    repositories { 
     mavenLocal() 
     maven {url "http://repo1.maven.org/maven2"} 
    } 


} 

subprojects { 

    project (':subproj1') { 

     def oldN = new File("D:/rootproj/subproj1/mybuild.number").text.split("=")[1] 
     def newN = (oldN.toInteger() + 1).toString() 
     ant.replace(
      file: "mybuild.number", 
      token: "${oldN}", 
      value: "${newN}" 
     ) 
     println "From subproj1 : ${newN}" 
     task hello(overwrite: true){ 
      doLast{ 
       println "hello from subproject 1" 
      } 
     } 

    } 
    project (':subproj2'){ 

     println "the build Dir: $buildDir" 
     task hello(overwrite: true){ 
      doLast{ 
       println "hello from subproject 2" 
      } 
     } 

    } 
} 

내가 실행

Gradle을 -q subproj1 : 안녕하세요

또는

Gradle을 -q subproj2 안녕하세요

또는

Gradle을

행 루트 프로, 나는 항상 예를 ​​들어.

.... subproj1에서
: 24
빌드 디렉터리 : D : 25
빌드 디렉터리 : D : \ rootproj \ subproj2 \ \ rootproj \ subproj2 \ subproj1에서
를 구축 두 개의 하위 프로젝트는 항상 때문에 빌드 번호가 두 배 증가, 두 번 실행 얻을 왜

1. 대신 한 번 구축?
2. 프로젝트 : 명령 줄에서 작업을 명시 적으로 지정 했는데도 모든 하위 프로젝트가 실행되는 이유는 무엇입니까?
인터넷을 검색했지만 유용한 정보를 찾을 수 없습니다.
미리 도움을 주셔서 감사합니다.

편집 : 변경 빌드[email protected] Nizet로 Gradle을 제안 :

  1. 이동합니다 ant.replace이 하위

내가 예상 한대로 정확히 작동

  • 주석으로 증분 작업 할 수 있습니다.

    allprojects { 
        repositories { 
         mavenLocal() 
         maven {url "http://repo1.maven.org/maven2"} 
        } 
    } 
    
    //subprojects { 
        def oldN = new File("E:/hqin/build/gradle/rootproj/subproj1/mybuild.number").text.split("=")[1] 
        def newN = (oldN.toInteger() + 1).toString() 
        project (':subproj1') { 
    
         task incr { 
          doLast{ 
    
           ant.replace(
            file: "mybuild.number", 
            token: "${oldN}", 
            value: "${newN}" 
           ) 
          } 
          println "From subproj1 : ${newN}" 
         } 
         task hello(overwrite: true, dependsOn: 'incr'){ 
          doLast{ 
           println "hello from subproject 1" 
          } 
         } 
    
        } 
        project (':subproj2'){ 
    
    
         task hello(overwrite: true){ 
          doLast{ 
           println "the build Dir: $buildDir" 
           println "hello from subproject 2" 
          } 
         } 
    
        } 
    //} 
    
  • 답변

    1

    두 번째 사항에 관하여 : 코드는 실행중인 작업에 관계없이 항상 실행되는 프로젝트 구성의 일부로 실행되기 때문에. 당신이 작업이 실행될 때 코드가 실행되고 싶은 경우에, 그것은 작업 정의의 doLast 폐쇄 내부에 있어야한다 :

    task someTask { 
        doLast { 
        ... 
        } 
    } 
    

    첫 번째 점에 대해서는 : subprojects에 전달 된 폐쇄 각 하위 프로젝트에 대해 실행됩니다. 따라서 하위 프로젝트 1에 대해 한 번 호출되고 하위 프로젝트 1과 하위 프로젝트 2를 구성한 다음 하위 프로젝트 2에 대해 다시 호출되고 하위 프로젝트 1과 하위 프로젝트 2가 다시 구성됩니다. subprojects을 전혀 갖고 있지 않아야합니다.

    +0

    위대한! 내가 제안한대로 build.gradle 파일을 수정하여 예상대로 작동합니다. 감사! – Heinz

    +0

    후속 질문이 있습니다. gradle -q : subproj2 : hello를 실행하면 subproj1과 해당 작업 incr이 실행됩니다. 어떻게 피할 수 있습니까? – Heinz

    +0

    실행 되었습니까, 아니면 구성되어 있습니까? println "From subproj1 : $ {newN}"은 실행 단계에서 실행되지 않고 실행 단계 –

    관련 문제