如何在Gradle中的子项目之间复制文件

如何在Gradle中的子项目之间复制文件,gradle,Gradle,如何使子项目复制同级子项目生成的文件?所有这些都需要适当的依赖关系管理,并且不需要假设使用任何特定于语言的插件(如JavaPlugin) 我已经看过Gradle 6的最新草案,但它并没有真正回答这个问题 我的多项目结构类似于: top/ build.gradle settings.gradle producer/ build.gradle myFile_template.txt consumer/ build.gradle 我想要一个Copy-任务

如何使子项目复制同级子项目生成的文件?所有这些都需要适当的依赖关系管理,并且不需要假设使用任何特定于语言的插件(如
JavaPlugin

我已经看过Gradle 6的最新草案,但它并没有真正回答这个问题

我的多项目结构类似于:

top/
  build.gradle
  settings.gradle
  producer/
     build.gradle
     myFile_template.txt
  consumer/
     build.gradle
我想要一个
Copy
-任务在
producer/build.gradle
中复制并转换
myFile\u template.txt
$buildDir/target/myFile.txt
中,另一个
Copy
-任务在
consumer/build.gradle
中应该进一步复制并将
myFile.txt
转换到
finalFile.txt

假定一个合适的解决方案能够使用task
outputs.files
或类似的文件,这样
consumer/build.gradle
就不需要明确提到
$buildDir/target/myFile.txt
的位置


(我对Gradle完全陌生)。

Gradle给了你很多自由,但我更喜欢项目之间通过和/或“共享”。我觉得一个项目永远不应该关心另一个项目的任务,并且觉得这些任务对每个项目都是私有的

考虑到这个原则,你可以做如下事情

project(':producer') {
   configurations {
      transformed 
   }
   task transformTemplate(type: Copy) {
       from 'src/main/template' 
       into "$buildDir/transformed" 
       filter(...) // transformation goes here 
   } 
   dependencies {
      // file collection derived from a task. 
      // Any task which uses this as a task input will depend on the transformTemplate task 
      transformed files(transformTemplate) 
   } 
} 
project(':consumer') {
   configurations {
      producerTransformed
   } 
   dependencies {
      producerTransformed project(path: ':producer', configuration: 'transformed') 
   } 
   task transformProducer(type:Copy) {
      from configurations.producerTransformed // this will create a task dependency 
      into ... 
      filter ... 
   } 
}     

谢谢我尝试了上述方法(注释掉
过滤器
行,并将
中的路径放入
,但是
gradle任务
中说:“带有路径的项目”:在根项目“so_57774921”中找不到生产者。另外,消耗品依赖项和可解析依赖项之间的区别如何文档强调的(
可以使用
/
可以解决
)最后,我担心配置中的
。producerTransformed
表示整个文件夹内容(例如,由其他任务创建的内容)不仅仅是
transformTemplate
任务复制的东西,我也不知道。最后,是否不需要工件?您需要在多模块构建中将生产者和消费者配置为模块。它们需要在settings.gradle中配置。您可以在
依赖项{…}中将文件添加到配置中
block。您会注意到,我声明了正在添加的确切配置,因此它不会包括整个项目。请试用并返回。事实上,我的
设置。gradle
已经消失。现在它似乎可以工作了,只是我担心配置中的
。producerTransformed
似乎是有保证的,即它指的是整个de>:producer/build/transformed/文件夹,而不仅仅是由
transformTemplate
生成的文件。因此,如果存在其他文件,它们也将由
transformProducer
复制,这是不可取的。此外,我不理解
依赖项
块:
已转换
配置(使用相同的名称)或者它是否可以使用其他名称,如
transformedDependence
,同时保留
transformed
作为配置名称?最后,您的方法是否有任何缺点,而不是我链接的文档中使用的基于
工件{}
的方法(因为您的方法似乎更简单)?是的,
dependencies{…}
块中的第一件事是将
FileCollection
添加到的配置