我想知道是否可以同时在多个功能分支上处理 Maven 项目,并避免不断覆盖 Nexus 中其他功能分支产生的工件。
我正在一个跨国项目中工作,该项目使用 gitflow 工作流来开发多个组件(30+)。每个组件都有一个 git 存储库,因此 gitflow 工作流应用于每个组件。所以每个组件都有一个开发和几个功能分支。通常,每个组件产生至少一种由其 GAV 识别的人工制品。
假设我们有组件 A(带有特征分支 feature/A-foo 和 feature/A-bar)和 B(带有特征分支 feature/B-foo)
Component A:
A:develop
A:feature/A-foo
A:feature/A-bar
Component B:
B:develop
B:feature/B-foo
Run Code Online (Sandbox Code Playgroud)
A:feature/A-foo 和 B:feature/B-foo 工作在同一个主题上,需要交换快照版本以测试它们的交互(例如客户端/服务器功能)。组件 A 和 B 只能通过 Nexus 交换工件(无法访问其他组件的源代码)。因此,A:feature/A-foo 必须部署其快照工件以使其可用于 B:feature/B-foo,反之亦然。
但是当 A:feature/A-bar(适用于完全不同的主题)之后部署时,由于相同的 GAV 和更新的时间戳,它会“覆盖”Nexus 中的快照工件,并且 B:feature/B-foo 将导入在其下一个构建中出现错误的工件。
一种解决方案是使用功能名称(例如 foo)扩展 GAV:
some.company.componentA-1.2.3-foo.jar
some.company.componentA-1.2.3-bar.jar
some.company.componentB-3.2.1-foo.jar
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以避免 A:feature/A-foo 覆盖 A:feature/B-bar 的工件,因为它们具有不同的 GAV。但这非常容易出错(在分支时重命名 GAV,再次合并到开发时将其重命名;如果有人忘记重命名,它会搞乱构建)。
有没有更好的解决办法?还是应该禁止在功能分支上部署?
我正在使用 Maven 3.1.1 和exec-maven-plugin(1.3) 以便在构建作业期间执行 bash 脚本。
bash 脚本stdout使用echo和生成输出printf。我注意到脚本的输出不会立即写入 Maven 控制台输出。相反,Maven 控制台输出“冻结”,直到它一次被 bash 脚本的多个输出行更新。我不知道更新 Maven 输出的触发器是什么(超时?完整的输出缓冲区?)但它非常慢。
让我们来看一个非常简单的 bash 脚本,例如counter.sh:
#!/usr/bin/env bash
for i in `seq 1 1000`; do
echo $i
sleep 0.5
done
Run Code Online (Sandbox Code Playgroud)
这是我的插件配置pom.xml:
<plugin>
<artifactId>exec-maven-plugin</artifactId>
<groupId>org.codehaus.mojo</groupId>
<version>1.3</version>
<executions>
<execution>
<id>execute-script</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${project.build.directory}/executable/counter.sh</executable>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当我使用 执行构建作业时mvn clean package,maven 输出冻结在exec-maven-plugin并且不显示任何进度/输出,直到脚本在大约 8 分钟后完成。
当我执行另一个运行时间更长的脚本时,我每约 15 分钟得到一个输出块。
我正在寻找的是一种在 Maven 控制台输出中即时查看 …