代码之家  ›  专栏  ›  技术社区  ›  super.t

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

  •  2
  • super.t  · 技术社区  · 6 年前

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

    1. 由wepback捆绑的JS前端调用 admin-frontend
    2. 调用了JavaSpring后端 admin-backend

    中的生成任务 管理前端 运行发出捆绑包的webpack admin-frontend/build/resources/static . 中的相应命令 管理后端 编译Java应用程序。

    我需要格雷德:

    1. 建造 管理前端
    2. 复制 管理前端/生成/资源/静态 admin-backend/src/main/resources/static
    3. 建造 管理后端 这样构建将包括在第二步复制的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 回复  |  直到 6 年前
        1
  •  1
  •   Peter Ledbrook    6 年前

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

    首先将静态资源声明为输出或 artifact 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
    

    理想情况下,您可以将其配置为 主要的 源集的资源,但这似乎只适用于目录,而不是文件集合。我认为有一个老生常谈的办法:

    1. 创建一个任务,将静态资源复制到 $buildDir版本
    2. 将该目录配置为主源集的输出( see second example in SourceSetOutput API doc )确保将输出声明为 builtBy 步骤1中的任务
    3. 坐下来看着Gradle自动执行任务 管理前端 生成静态资源,将这些资源复制到 admin-backend ,并将它们打包到生成的应用程序中。换句话说,您应该在 管理前端 管理后端 .

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

        2
  •  0
  •   super.t    6 年前

    我在根目录中完成了以下任务 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。