【问题标题】:Copy build artifacts to a source set in Gradle multi project build将构建工件复制到 Gradle 多项目构建中的源集
【发布时间】:2018-08-03 12:34:58
【问题描述】:

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

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

admin-frontend 中的构建任务运行 webpack,它将捆绑包发送到 admin-frontend/build/resources/staticadmin-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


    【解决方案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 源集资源的一部分,但这似乎只适用于目录,而不是文件集合。我认为有一个 hacky 方法:

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

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

    【讨论】:

      【解决方案2】:

      我在根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。

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 2015-04-26
        • 2021-02-15
        • 2021-03-31
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多