首页 文章

限制在Ivy发布版本

提问于
浏览
1

场景

我们的平台模块( PNX )发布到我们的本地Artifactory服务器,具有4位数字的类似SemVersion的版本控制方案

3.x.y.z

特别是, z 在错误修正上增加 . 我们的政策是模块(例如 ARFFTTPGS 等)采用它们编译的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-BETAintegration 状态,我也在另一个项目中使用 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),然后是我们的内部 acmeacme-integration 存储库 .

1 回答

  • 0

    首先,您必须了解Artifactory 's Maven repository layout is not ivy'的原生格式 . ibiblio resolver能够理解和翻译Maven repository metadata .

    例如,以下是与Maven中心的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中作为Snapshot版本实现 .

    最后,可以将ibiblio resolver配置为不使用远程存储库元数据:

    <ibiblio name="MyRepo" m2compatible="true" useMavenMetadata="false" root="http://…" />
    

    通常这很少需要,除非不能依赖repo元数据文件(这是weirdly common) .

相关问题