首页 > 解决方案 > 将构建工件复制到 Gradle 多项目构建中的源集

问题描述

我有一个由两个子项目组成的根 gradle 项目:

  1. 由 wepback 捆绑的 JS 前端称为admin-frontend
  2. Java Spring后端调用admin-backend

中的构建任务admin-frontend运行 webpack,它将捆绑包发送到admin-frontend/build/resources/static. 中的相应命令admin-backend编译 Java 应用程序。

我需要 gradle 来:

  1. 建造admin-frontend
  2. 复制admin-frontend/build/resources/staticadmin-backend/src/main/resources/static
  3. 构建admin-backend以便构建包含在第二步复制的 webpack 包

我该怎么做?

这是目录结构:

.
├── admin-backend
│   ├── build
│   ├── build.gradle
│   ├── src
│       ├── main
│           ├── resources
│               ├── static
├── admin-frontend
│   ├── build
│   │   ├── resources
│   │       ├── static
│   ├── build.gradle
├── build.gradle
├── gradle
│   └── wrapper
├── gradlew
├── gradlew.bat
└── settings.gradle

标签: gradle

解决方案


这是个有趣的问题。请不要将此答案视为权威,甚至不要将其视为将/可以起作用的东西,但这是您可能想尝试的东西。

首先将静态资源声明为项目的输出(或工件admin-frontend。您应该可以通过以下方式做到这一点:

configurations {
    staticFiles
}

artifacts {
    staticFiles file("$buildDir/resources/static"), {
        builtBy build
    }
} 

老实说,我对上面的语法有所猜测。此外,您最好将 替换为file(...)实际生成静态文件的任务或任务列表。ArtifactHandler请参阅API 文档中的示例。

现在您需要做的就是将该配置作为依赖项添加到后端项目中。就像是:

configurations {
    frontEndResources
}

dependencies {
    frontEndResources project(path: ":path:to:admin-frontend", configuration: "staticResources")
}

然后,您应该能够使用configurations.frontEndResources您认为合适的方式合并静态资源。例如,如果您想将它们包含在项目的 JAR 中:

jar.from configurations.frontEndResources

理想情况下,您可以将其配置为主要源集资源的一部分,但这似乎只适用于目录,而不是文件集合。我认为有一个hacky方式:

  1. 创建一个任务,将静态资源复制到$buildDir下的某个自定义目录
  2. 将该目录配置为主要源集的输出(参见SourceSetOutputAPI 文档中的第二个示例)——确保指定输出被声明为builtBy步骤 1 中的任务
  3. 坐下来看看 Gradle 将自动运行admin-frontend生成静态资源的任务,将这些资源复制到admin-backend,并将它们打包到生成的应用程序中。换句话说,您应该让增量构建在admin-frontend和之间顺利运行admin-backend

现在剩下要做的就是看看它是否真的有效:)


推荐阅读