2013-02-14 229 views
1

我有一个Gradle多项目。Gradle项目依赖不会构建依赖项目

项目之一是Flex项目,它是使用gradleFx插件构建的。

第二个是战争项目,我需要将来自Flex项目的SWF文件包含到战争中。

我添加

war { 
    from (project(":flex:FlexManager").buildDir) {into ('flash')} 
} 

,它并把SWF陷入战争,但只有当SWF已经存在。

然后,我希望Gradle能够在构建战争期间构建flex:FlexManager项目。所以,我想补充

dependencies { 
    .... 
    runtime project(path : ':flex:FlexManager') 
} 

的唯一途径,我发现战争构建过程中,启动Flex项目生成已

war { 
    ... 
    dependsOn ':flex:FlexManager:build' 
} 

但看起来不是最好的方式 - 我喜欢定义项目依赖任务的依赖性,而不是

回答

2

所有你需要改变的是指定你想从一个任务或任务输出而不是一个目录复制 - 这将在你的战争任务和构建swf文件的任何任务之间注册一个隐式依赖。

表示构建swf文件的任务需要指定其输出。我快速浏览了GradleFx,不幸的是,它看起来像compileFlex任务不行。所以首先你需要为任务指定的输出方式如下:

compileFlex { 
    outputs.dir project.buildDir 
} 

,然后修改你的战争任务配置:

war { 
    from project(":flex:FlexManager").compileFlex { 
     into ('flash') 
    } 
} 

你或许还应该唠叨在GradleFx开发者增加产出到他们的任务。 :)

编辑:

从评论,我理解,除了取决于任务,你可以依赖于项目工件的讨论。最彻底的方法是创建一个自定义配置,添加依赖于它,然后配置战争任务时,在使用它拨打电话:

configuration { 
    flex 
} 

dependencies { 
    flex project(':flex:FlexManager') 
} 

war { 
    from configurations.flex { 
     into ('flash') 
    } 
} 

你也许还利用:flex:FlexManager直接归档或默认配置:

war { 
    from project(':flex:FlexManager').configurations.archives { 
     into ('flash') 
    } 
} 
+0

它有帮助,谢谢! 但是,我可以创建项目之间的依赖关系,而不是任务? – 2013-02-14 20:17:22

+0

不,你不能,在Gradle中没有这样的概念,你只能指定任务之间的依赖关系。你需要什么项目依赖关系? – erdi 2013-02-14 20:42:47

+0

谢谢,我不需要。我只是认为,就像外部依赖关系一样,我们定义了对构件的依赖性(即构建结果),就像我可以为项目依赖性定义它一样 - 即我的项目依赖于另一个项目构件(构建结果) – 2013-02-14 21:00:30

0

我的项目中有类似的要求。我需要包含swf文件,这是flex项目的输出到java项目并构建战争。

1. I created a two sub project under war project, flex and java. 
2. Included them in settings file. 
3. The main build.gradle file has basic configuration. 
4. In flex sub project gradlefx plugin is applied and the output swf file is copied to the directory using a copy task. 
5. In java sub project war plugin is applied and the source directory is mentioned from which war has to be generated. 

这是给你参考的示例代码:

设置。XML:在myproject的目录

include myproject, 
myproject:mysubproject:flex, 
myproject:mysubproject:java 

的build.gradle文件:在的myproject/mysubproject /柔性DIR

buildscript { 
    dependencies { 
     classpath project (":FlexProject") //include all the flex project from which the swf file to be included 
    } 
} 
dependencies { 
    classpath project (":JavaProject") //include all the dependent java project if any 
} 

sourceSets { 
    main { 
    output.classesDir = 'root/WEB-INF/classes' //This is the directory from which I am going to generate war. 
    } 
} 

的build.gradle文件:在myproject的

apply plugin: 'gradlefx' 
type = 'swf' 
dependencies{ 
    merged project (":FlexProject") 
} 

String rootProjectDir = rootDir 
rootProjectDir = rootProjectDir.replaceAll("\\\\","/") 

task copyTask <<{ 
    copy{ 
     from rootProjectDir +'/MyFlexProject1/build' 
     into rootProjectDir +'/myproject/root' 
     include '**/*.swf' 
    } 
} 
build.finalizedBy(copyTask) 

的build.gradle文件/ mysubproject/java目录:

String rootProjectDir = rootDir 
rootProjectDir = rootProjectDir.replaceAll("\\\\","/") 
String rootProjectDirDocRoot = rootProjectDir + '/myproject/root' 

dependencies { 
    compile project (":JavaProject") //to include dependent jars in war 
} 

group = "com.abc.enterprise" 
archivesBaseName = "myprojet" 
description = "myproject" 
apply plugin: 'war' 

war{ 
    from rootProjectDirDocRoot 
    exclude('.gradle') 
    exclude('.settings') 
} 

这将每次编译flex项目,他的swf文件将被包含在战争目录中。希望这可以帮助。