我们的平台模块(PNX
)已发布到我们当地的Artifactory服务器,其中包含4位数字的类似SemVersion的版本控制方案
3.x.y.z
特别是,z
在错误修正上增加。我们的政策是模块(例如ARF
,FTT
,PGS
等)采用它们编译的PNX版本的最新修正版本。例如如果FTT
在构建WAR之后编译PNX 3.4.5.7
,则必须使用PNX的最新3.4.5.x
,这可能是某天3.4.5.10
。
我们几周前发布了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-BETA
准备好之前,我发布了integration
3.3.3.1
状态,我还在另一个项目中使用3.5.0.0-BETA
。有一天,我在ARF
模块工作的同事使用3.3.3.+
版本约束发布了发布到生产的版本,但最终解决了3.3.3.1-BETA
!!
我想了解是否以及如何在Ivy中指定修订约束,该版本约束在版本范围内采用最新的稳定版本,其中只有内部版本号未知(取3。 xyz示例,其中3是您视角中的虚荣版本号。)
常春藤提供latest.release
约束,但当它们可用时它也会匹配3.4.x.y
(这就是我所做的不想要的)。但是,+
版本匹配器也匹配beta,但仍然不正确。
[编辑] 常春藤设置:
<?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
存储库。
答案 0 :(得分:0)
首先,您必须了解Artifactory的Maven存储库布局不是常春藤的原生格式。 ibiblio resolver能够理解和翻译Maven repository metadata。
例如,以下是与Maven central中的log4j module相关联的元数据:
<metadata modelVersion="1.1.0">
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<versioning>
<latest>1.2.17</latest>
<release>1.2.17</release>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
..
..
</versions>
<lastUpdated>20140318154402</lastUpdated>
</versioning>
</metadata>
请注意“最新”和“发布”标签?您的模块的元数据显示了什么?我怀疑你发现它是3.3.3.1-BETA,这可以解释你的问题。
Ivy的“集成”版本概念将在Maven中作为快照版本实现。
最后,可以将ibiblio resolver配置为不使用远程存储库元数据:
<ibiblio name="MyRepo" m2compatible="true" useMavenMetadata="false" root="http://…" />
通常这很少需要,除非不能依赖repo元数据文件(weirdly common)。