我目前正在尝试了解生成 VC 标签时 Ivy 工作流程如何(我们使用的是 SVN,但这并不重要)。
问题是,我们开发了多个相互依赖的库。为了简化开发,ivy.xml
中的依赖项标记将属性 rev
设置为 latest.integration
。
<dependencies>
<dependency org="my-company" name="my-lib" rev="latest.integration"/>
</dependencies>
实际上是结果表格this question在 StackOverflow 上。这有助于我们在一个库中快速进行更改,并在主应用程序中运行单元测试,而无需手动更改版本。
开发完成后,我们将库发布到内部共享 Ivy 存储库并创建 SVN 标签。
出现的问题是,一旦我们需要从标签重建软件,Ivy 仍然指向 latest.integration
,在稍后的时间点,它很可能会指向另一个集成构建,甚至可能是以后发布的版本(取决于解析器配置)。
现在这个问题很明显了:让 Ivy 解析在创建 VCS 标记时为 integration.latest
的已发布修订版的最佳方式是什么。如果答案不是“在创建标签之前手动输入已发布的修订版本”,这将非常有帮助。也许我需要在 ANT 构建脚本中添加一些内容,也许在我的 settings.xml
或 ivy.xml
中进行一些更改。
既然Ivy是一个相当聪明又方便的小工具,我想一定有办法做到这一点......
最佳答案
Ivy deliver task用于从项目的原始文件创建解析的ivy文件。我所说的“已解决”是指适合发布到远程存储库的文件。这意味着不仅解决了动态依赖关系,还在模块的 info tag 中设置了可选修订版和状态属性。 .
以下示例在构建目录中创建一个 ivy.xml 文件:
<ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${project.version}" status="release"/>
检查文件,您会发现依赖版本已设置。
在这一点上值得注意的是,这种能力是区分 ivy 和 Maven 的微妙但重要的点之一。 Ivy 允许您的自动化发布系统简单地创建标签并运行构建。看一下 Maven 所需的复杂步骤,以及它的 release plugin 自动化的步骤。 :
- 检查源中是否存在未提交的更改
- 检查是否存在 SNAPSHOT 依赖项
- 将 POM 中的版本从 x-SNAPSHOT 更改为新版本(系统将提示您选择要使用的版本)
- 转换 POM 中的 SCM 信息以包含标签的最终目的地
- 针对修改后的 POM 运行项目测试,以确认一切正常工作
- 提交修改后的 POM
- 使用版本名称标记 SCM 中的代码(系统会提示输入)
- 将 POM 中的版本更改为新值 y-SNAPSHOT(系统也会提示输入这些值)
- 提交修改后的 POM
仔细数一下...这是 2 次提交和一个标记操作...都是因为 Maven 的模块版本是强制性的,并且我们试图在 SCM 中捕获已解析的依赖项...
所以,我的建议是谨慎模仿 Maven。当我标记代码时,我捕获了构建代码的时间点。我依赖的事实是,推送到我的远程存储库的 ivy 文件已完全解析。真正偏执的人当然可以保留此 ivy 文件的本地副本,但它永远不会是用于构建原始文件的文件。实际上,永远不可能真正重现原始二进制文件,而只是近似它的东西。
其他信息
为了帮助理解如何使用交付任务,以下示例展示了在将 ANT 工件发布到 Nexus 等 Maven 存储库时如何使用它来创建已解析的 Maven POM 文件:
关于tags - Ivy 如何与版本控制标签一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843936/