Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle项目,重复执行的子项目_Gradle_Project_Subproject - Fatal编程技术网

Gradle项目,重复执行的子项目

Gradle项目,重复执行的子项目,gradle,project,subproject,Gradle,Project,Subproject,我有一个带有子项目的项目。布局: rootproj --次级J1 ----mybuild.number --次级J2 --build.gradle --渐变属性 --设置。渐变 mybuild.number 格雷德尔酒店 格雷德尔先生 当我跑的时候 gradle-q:hello 或 gradle-q:hello 或 格拉德尔 从rootproj,我总是得到例如 从J1:24开始 生成目录:D:\rootproj\subboj2\build 从J1:25开始 生成目录:D:\rootproj\s

我有一个带有子项目的项目。布局:

rootproj
--次级J1
----mybuild.number
--次级J2
--build.gradle
--渐变属性
--设置。渐变

mybuild.number

格雷德尔酒店

格雷德尔先生

当我跑的时候

gradle-q:hello


gradle-q:hello


格拉德尔

从rootproj,我总是得到例如


从J1:24开始
生成目录:D:\rootproj\subboj2\build
从J1:25开始
生成目录:D:\rootproj\subboj2\build

一,。为什么这两个子项目总是执行两次,因此生成数量增加两次,而不是一次?
2.为什么即使我在命令行中明确指定了project:task,所有子项目都会执行?
我在网上搜索过,找不到有用的信息。
提前谢谢你的帮助

编辑: 将build.gradle更改为@JB Nizet建议的值:

  • 将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"
                }
            }
    
        }
    //}
    

    关于第二点:因为您的代码是作为项目配置的一部分运行的,无论执行什么任务,项目配置总是运行的。如果希望在执行任务时执行代码,则代码应位于任务定义的doLast闭包内:

    task someTask {
      doLast {
        ...
      }
    }
    

    关于第一点:传递给
    子项目的闭包将针对每个子项目执行。因此,对子项目1调用一次,然后配置子项目1和子项目2,然后对子项目2再次调用,然后重新配置子项目1和子项目2。你根本不应该有
    子项目

    太好了!我按照您的建议修改了build.gradle文件,它按预期工作。谢谢我有一个后续问题:当我运行gradle-q:subproj2:hello时,subproj1及其task incr仍然被执行。如何避免这种情况?是执行还是配置?println“From subproj1:${newN}”在配置阶段执行,而不是在执行阶段。它在配置阶段执行,但重要的是结果是相同的。我不希望在执行extecute时增加newN:subsubj2.hello。我可能会在rootproj中使用过滤器配置,但这似乎很不方便。它是在配置阶段执行的:这还不清楚。将始终配置该任务。因此,println是配置阶段的一部分,因为它不在doLast闭包中,它将始终被执行。但是doLast闭包本身不应该被执行。您是否注意到该文件已被修改?还是你只是在观察指纹?
    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"
                }
            }
    
        }
    }
    
        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"
                }
            }
    
        }
    //}
    
    task someTask {
      doLast {
        ...
      }
    }