Groovy 如何自定义每个依赖项的目标路径

Groovy 如何自定义每个依赖项的目标路径,groovy,gradle,Groovy,Gradle,我正在尝试使用Gradle来管理非Java项目中的依赖项。其想法是拥有一个单一的通用插件,该插件与项目的gradle.build文件一起将项目所需的任何依赖项引入到项目中,并将每个依赖项放置在项目期望文件驻留的位置。目前,将它们全部放在项目的/libs/文件夹中是可行的,但这还不够。我希望能够在gradle.build文件中指定在项目中放置依赖项的位置 这里有一个简单的例子:我有一个项目,多年来一直作为其他项目的一个组成部分使用。当核心组件代码被更新时,更新所有项目是一件非常痛苦的事情。。。每个

我正在尝试使用Gradle来管理非Java项目中的依赖项。其想法是拥有一个单一的通用插件,该插件与项目的gradle.build文件一起将项目所需的任何依赖项引入到项目中,并将每个依赖项放置在项目期望文件驻留的位置。目前,将它们全部放在项目的/libs/文件夹中是可行的,但这还不够。我希望能够在gradle.build文件中指定在项目中放置依赖项的位置

这里有一个简单的例子:我有一个项目,多年来一直作为其他项目的一个组成部分使用。当核心组件代码被更新时,更新所有项目是一件非常痛苦的事情。。。每个项目存储库都必须提交新文件(特别是使用SVN)。文件必须驻留在特定目录中,以便ColdFusion框架(FW/1)与代码正确交互

所以已经做的是核心组件现在在Artifactory中,gradle.build文件将其拉入项目中。如果这是唯一的依赖项,那么故事就到此结束了,但是还有其他依赖项需要被删除,代码希望这些依赖项位于与该组件不同的目录中。每个项目都有不同的依赖项,并且可能有不同的文件结构(例如,我们的旧应用程序使用Fusebox框架)。因此,我所追求的是控制gradle.build文件中指定的依赖项结束位置的能力

这就是我希望能够做到的:

dependencies {
    // exploded is a configuration that is added to this plugin

    exploded('com.foo:bar:2.0-SNAPSHOT@zip') {
        ext {
            moveWhat = ['app']
            moveWhere = 'assets'
        }
    }
    exploded('com.foo2:bar2:1.0-SNAPSHOT@zip') {
        ext {
            moveWhat = ['*']
            moveWhere = 'lib'
        }
    }
...
希望是我可以将目录/文件传递到moveWhere,然后将其放置到moveWhere指定的目录中,但是我很难弄清楚如何将属性与每个依赖项关联。我不知道这是否可能


有人能给我指出正确的方向吗?

我建议您使用单独的任务从配置中提取所需内容。大概是这样的:

task copyFromExploded(type: Copy) {
    into new File(project.buildDir, "assets")
    from (configurations.exploded)
    include "**/app"
}

这可以在自定义任务中完成,而不是在依赖项块中完成吗?您是否建议在依赖项之间的其他位置以及它们应该去的地方建立一个映射?使用该映射调用自定义任务?不,我建议使用一个任务,将依赖项放在需要的位置,并作为buildle的一部分运行,但是gradle.build如何告诉任务依赖项的位置?目标是为每个项目提供一个通用插件,而不是定制插件。(如果这还不清楚,请告诉我,我会更新我的问题——我是Gradle的新手,人们的假设可能是什么。)你能给出一个简单完整的例子/说明你需要在问题中做什么吗?但是,我如何控制每个依赖项的复制位置?我希望它比在插件中硬编码更具动态性。(我编辑了示例代码,以防之前不清楚。)我想您可以在表示配置的FileCollection对象上使用filter(闭包c)。但这取决于是否有足够的元数据进行筛选(文件名等)。configurations.exploded.filter{file->file.name.contains(pattern)}