如何将构建输出从一个git repo集成到另一个

gan*_*404 7 git git-submodules git-subtree

我正在处理2个项目,这些项目存储在2 git repos Project1和Project2中

Project1是一个javascript项目.它有自己的回购协议(例如https://github.com/gandra/project1.git)
Project2的是一个Java Maven项目.它有自己的回购(例如 https://github.com/gandra/project2.git)

这是我想要改进的当前工作流程:

  1. 提交Project1中的更改​​并将其推送到原点
  2. 在Project1中运行grunt.这会生成Project1/build目录
  3. 将Project1/build内容手动复制到Project2/libs/project1-lib目录中
  4. 在Project2中提交更改(Project2/libs/project1-lib)
  5. Runk jenkins构建和部署

我想以某种方式避免第3步(将Project1/build内容手动复制到Project2/libs/project1-lib目录中)我想将Project1作为子树集成到Project2中但是这种方法的问题是因为它获取了所有Project1目录结构到Project2/libs/project1-lib,我只想获取Project1的子目录(Project1/build/*)

一些重要的注意事项:Project1更改仅在其自己的存储库中发生(https://github.com/gandra/project1.git),此更改应传播到Project2.所以没有从Project2/libs/project1-lib更新Project1换句话说:
- Project1中的提交影响Project2
- Project2中的提交不影响Project1

Jar*_*c85 1

好吧,让我们回顾一下最重要的事实:

  1. Project2 是 Maven 项目(可能带有 war 打包,因为您将部署它)。
  2. Project2 依赖于 Project1,它期望其输出构建在路径 Project2/libs/project1-lib 上

在我看来,构建(甚至是部分构建)并不意味着要在任何源代码管理下进行,因此我不会将 Project2 的任何路径(例如 Project2/libs/project1-lib)保留在 git 下。Maven war 插件有一个很好的功能maven-war-plugin-overlays。因此,如果 Project2 会将 Project1 视为具有 war 类型的 packaginig 的 Maven 依赖项,例如

  <dependencies>
    ...
    <dependency>
      <groupId>your.group.id</groupId>
      <artifactId>project1</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
      <scope>runtime</scope>
    </dependency>
    ...
  </dependencies>
Run Code Online (Sandbox Code Playgroud)

,您不必对 Project2/libs/project1-lib 位置进行任何处理,因为这将在打包阶段为您完成。但要做到这一点,您必须将 Project1 的战争工件安装到您的连接中。这里有几个解决方案:

解决方案1)

  1. 使Project1完全成为maven项目,并确保构建的输出在他的war中的路径./libs/project1-lib上完成。由于 Project1 现在将使用 maven 构建,因此您必须集成 Project1 以前的构建工具(grunt、gulp 或任何一个),以便在打包阶段之前的某个阶段由 maven 调用。
  2. 在 Project2 中添加新的依赖项,如下所示:

    <dependency>
      <groupId>your.group.id</groupId>
      <artifactId>project1</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>war</type>
      <scope>runtime</scope>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

解决方案2)。

  1. 使用您当前的 Project1 构建器,请确保使用以下结构将项目打包到 war 中:./libs/project1-lib。使用相同的构建器将其安装为您的 nexus 上的 war 工件(注意:您必须在您的 nexus 上安装 pom.xml,以便其他项目可以引用 Project1)如果您幸运地使用 grunt 作为 js 构建器,那么有这个 npm 组件grunt -nexus-deployer它将完全按照我在这里描述的方式进行。
  2. 与解决方案 1) 相同...

解释:

当您推送对 Project1 的更改时,您的 CI 将触发作业,该作业将在完成此操作后在您的 Nexus 上安装 project1-1.0-SNAPSHOT.war,将触发 Project2 的 CI 作业,并且它将包含项目 2 构建所需的一切。

注意:在这两个解决方案中,删除 Project2/libs/project1-lib 层次结构,因为它不再使用......

编辑:

对于解决方案 2),也许您应该使用grunt-maven-tasks而不是grunt-nexus-deployer,因为它有更多选项并且更合适。