Gradle:如何使一个任务依赖于跨项目的另一个任务的输出文件?

时间:2014-11-19 22:02:41

标签: gradle dependencies exec artifacts

我有两个任务都调用Exec闭包(task1和task2)。 task1 exec调用为task2生成输出文件,以作为输入的命令行参数。 task1和task2将是多项目构建中使用的同一gradle文件的一部分。我使用" apply from:"在多个项目中包含相同的gradle文件。我使用外部专业人员工作代码来传递这些文件,但我已经破坏了这一点,我觉得必须有更好的方法来管理这个。我想有一种更好的方法可以使用依赖项和工件,但是我很难在Java构建之外使用它们。这样做的目的是在这种类型的多个项目中重用它,并让它适当地管理它们之间的文件依赖性。我可以在项目中有n个项目输出task1,这些项目可能需要作为另一个项目中task2的输入。包括参考代码,但我觉得我所拥有的是根本上有缺陷和错综复杂的。

ext.task1generatedFile = file()
ext.task2InputsFromTask1 = files() //This is set up in individual subprojects.

subprojects{
    afterEvaluate {     Project project ->  

        ext.task1generatedFile = file("$project.buildDir/$project.name" + ".projlib")   

        task task1 {
            doLast{

                println "Building task1 output for $project.name"

                //task1generatedFile is created by myApp.exe
                exec {
                    workingDir "$appHome/bin"
                    commandLine "${appHome}/bin/myApp.exe", 
                    '-n', task1generatedFile.toString()                                
                }
            }               
        }                   
        task1.outputs.files task1generatedFile             

        task task2  {                         

            doLast {        
                println "Building Project task2 for $project.name from task1 output file(s) across multiple projects"

                //Handle optional parameters that are output from any number of task1 outputs from other projects.  This list can be empty depending on the project.
                String projLibCommas = "";              
                ArrayList<String> optionalArgs = new ArrayList<String>();

                //Need to constructed comma separated list for task1 outputs generated in other projects
                if (!task2InputsFromTask1.isEmpty()) {
                    optionalArgs.add("-pl");
                    projLibCommas = "\"" + task2InputsFromTask1[0];

                    for (int i =1; i < task2InputsFromTask1.getFiles().size(); i++ ) {
                        projLibCommas += "," + task2InputsFromTask1[i];
                    }   
                    projLibCommas += "\"";
                    optionalArgs.add(projLibCommas);
                }               

                exec {
                    workingDir "$appHome/bin"
                    commandLine "myApp2.exe",
                    args optionalArgs
                }       
            }       
        }       
        task2.inputs.files task1generatedFile       
    }
}

//在一些需要从其他项目生成文件的子项目中,我这样做。

task2.dependsOn ':ParentProj:AnotherProject:task1'
task2 {
    Project anotherProject = project(':ParentProj:AnotherProject')      
    ext.task2InputsFromTask1 = files(anotherProject.task1generatedFile);
}

0 个答案:

没有答案