将构建工件复制到Gradle多项目构建中的源集

时间:2018-08-03 12:34:58

标签: gradle

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

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

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

我需要gradle来

  1. 构建admin-frontend
  2. admin-frontend/build/resources/static复制到admin-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

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。请不要以这个答案为权威,甚至不要以为会/可以的,但您可能想尝试一下。

首先将静态资源声明为admin-frontend项目的输出或artifact。您应该可以使用以下内容来做到这一点:

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

理想情况下,您可以将其配置为 main 源集资源的一部分,但这似乎只能通过目录而不是文件集合来实现。我认为这是一种骇人听闻的方法:

  1. 创建一个将静态资源复制到 $ buildDir
  2. 下的自定义目录的任务
  3. 将该目录配置为主要来源集(see second example in SourceSetOutput API doc)的输出-确保您指定将输出声明为builtBy,将步骤1中的任务
  4. 坐下来观察Gradle将自动运行admin-frontend中的任务,这些任务会生成静态资源,将这些资源复制到admin-backend,然后将其打包到生成的应用程序中。换句话说,您应该在admin-frontendadmin-backend之间顺利进行增量构建。

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

答案 1 :(得分:0)

我最终在根build.gradle中完成了以下任务:

task build(dependsOn: ':frontend:webpack') {
    doLast {
        def backendStaticResources = new File(project(':backend').projectDir ,"/src/main/resources/static");
        def backendTemplates = new File(project(':backend').projectDir ,"/src/main/resources/templates");

        [backendStaticResources,backendTemplates].each {
            delete(fileTree(it) {
                exclude '.gitignore'
            })
        }

        copy {
            from file('frontend/build/index.html')
            into 'backend/src/main/resources/templates'
        }

        copy {
            from 'frontend/build'
            into 'backend/src/main/resources/static'
        }
    }
}

因此,首先运行webpack,将其内部版本复制到静态资源中,然后构建Java。