将生成工件复制到Gradle多项目生成中的源集

将生成工件复制到Gradle多项目生成中的源集,gradle,Gradle,我有一个根gradle项目,由两个子项目组成: 由wepback捆绑的JS前端称为admin frontend Java Spring后端称为管理后端 admin frontend中的构建任务运行webpack,该webpack将包发送到admin frontend/build/resources/static。admin backend中的相应命令编译Java应用程序 我需要格雷德尔: 构建管理前端 将admin前端/build/resources/static复制到admin后端/src/m

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

  • 由wepback捆绑的JS前端称为
    admin frontend
  • Java Spring后端称为管理后端
  • admin frontend
    中的构建任务运行webpack,该webpack将包发送到
    admin frontend/build/resources/static
    admin backend
    中的相应命令编译Java应用程序

    我需要格雷德尔:

  • 构建
    管理前端
  • admin前端/build/resources/static
    复制到
    admin后端/src/main/resources/static
  • 构建
    管理后端
    ,以便构建将包括在第二步复制的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
    

    这是一个有趣的问题。请不要认为这个答案是权威性的,甚至是有效的,但这是你可能想尝试的

    首先将静态资源声明为
    管理前端
    项目的输出或。您应该能够通过以下方式实现这一点:

    configurations {
        staticFiles
    }
    
    artifacts {
        staticFiles file("$buildDir/resources/static"), {
            builtBy build
        }
    } 
    
    老实说,我在猜测上面的语法。此外,您最好将
    文件(…)
    替换为实际生成静态文件的任务或任务列表。请参见API文档中的示例

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

    configurations {
        frontEndResources
    }
    
    dependencies {
        frontEndResources project(path: ":path:to:admin-frontend", configuration: "staticResources")
    }
    
    然后,您应该能够使用
    配置.frontEndResources
    以您认为合适的方式合并静态资源。例如,如果您想将它们包括在项目的JAR中:

    jar.from configurations.frontEndResources
    
    理想情况下,您可以将其配置为主要源集资源的一部分,但这似乎只适用于目录,而不适用于文件集合。我认为有一种方法可以解决这个问题:

  • 创建一个任务,将静态资源复制到$buildDir下的某个自定义目录
  • 将该目录配置为主源集()的输出-确保将输出声明为步骤1中的任务
  • 坐下来观看Gradle将自动运行
    管理前端
    中生成静态资源的任务,将这些资源复制到
    管理后端
    ,并将它们打包到生成的应用程序中。换句话说,您应该让增量构建在
    管理前端
    管理后端
    之间顺利运行

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

    我在root
    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