场景
我们的平台模块( PNX
)发布到我们的本地Artifactory服务器,具有4位数字的类似SemVersion的版本控制方案
3.x.y.z
特别是, z
在错误修正上增加 . 我们的政策是模块(例如 ARF
, FTT
, PGS
等)采用它们编译的PNX版本的最新修正版本 . 例如如果在 PNX 3.4.5.7
之后编译 FTT
时,它必须采用PNX的最新 3.4.5.x
,这可能是某天 3.4.5.10
.
当前版本和常 Spring 藤描述符
我们几周前发布了3.3.3.0版本,开发人员正在愉快地使用它 . 幸运的是,没有阻塞错误迫使我们释放 3.3.3.1
.
我们的项目显示 dependencies.xml
文件,如下所示
<dependency org="com.acme" name="PNX" rev="${pnx.version}" />
其中 pnx.version
等于 3.3.3.+
. 根据Ivy的sub-revision matcher,以上匹配任何与 3.3.3.0
等于或之后的版本,如我们所希望的那样 .
测试版存在问题
出于开发目的,我们开始发布( integration
状态)我们的 PNX
模块的测试版,以便我的同事可以开始测试其模块范围内的新功能或错误修正,因为单独使用PNX进行测试很困难 .
这是发生了什么 . 在官方 3.3.3.1
准备就绪之前,我发布了一个 3.3.3.1-BETA
的 integration
状态,我也在另一个项目中使用 3.5.0.0-BETA
. 有一天,我在 ARF
模块工作的同事使用 3.3.3.+
修订约束发布了运输到 生产环境 的版本,但最终解决了 3.3.3.1-BETA
!!
提问时间
我想了解是否以及如何在Ivy中指定修订约束,该版本约束在版本范围内采用最新的 stable 版本,其中只有内部版本号未知(请参阅3.xyz示例,其中3是虚荣版本号,来自你的观点) .
Ivy提供了 latest.release
约束,但是当它们可用时它也会匹配 3.4.x.y
(这就是我想做的事情 not ) . 但是, +
版匹配器也匹配beta,但仍然不正确 .
[编辑]常 Spring 藤设置:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ivysettings>
<settings defaultResolver="main" />
<!--Authentication required for publishing (deployment). 'Artifactory Realm' is the realm used by Artifactory so don't change it. -->
<credentials host="host.acme.com" realm="Artifactory Realm" username="deployment" passwd="deployment123" />
<resolvers>
<chain name="main" changingPattern=".*-BETA.*" checkmodified="true">
<ibiblio name="public" m2compatible="true" root="http://host.acme.com/artifactory/acme-all" />
<url name="cst" m2compatible="false">
<artifact pattern="http://host.acme.com/artifactory/acme/[organization]/[module]/[revision]/[type]s/[module].[ext]" />
<ivy pattern="http://host.acme.com/artifactory/acme/[organization]/[module]/[revision]/[type]s/ivy.xml" />
</url>
<url name="cst-integration" m2compatible="false" changingPattern=".*-BETA.*" checkmodified="true">
<artifact pattern="http://host.acme.com/artifactory/acme-integration/[organization]/[module]/[revision]/[type]s/[module](-[classifier])-[revision].[ext]" />
<ivy pattern="http://host.acme.com/artifactory/acme-integration/[organization]/[module]/[revision]/[type]s/ivy-[revision].xml" />
</url>
</chain>
</resolvers>
</ivysettings>
说明:我们有一个 acme-all
存储库,它是公共Maven的虚拟映射(因此使用ibiblio),然后是我们的内部 acme
和 acme-integration
存储库 .
1 回答
首先,您必须了解Artifactory 's Maven repository layout is not ivy'的原生格式 . ibiblio resolver能够理解和翻译Maven repository metadata .
例如,以下是与Maven中心的log4j module关联的元数据:
注意“最新”和“发布”标签?您的模块的元数据显示了什么?我怀疑你发现它是3.3.3.1-BETA,这可以解释你的问题 .
Ivy的“集成”版本概念将在Maven中作为Snapshot版本实现 .
最后,可以将ibiblio resolver配置为不使用远程存储库元数据:
通常这很少需要,除非不能依赖repo元数据文件(这是weirdly common) .