【问题标题】:How to block a status from an Ivy resolve如何阻止常春藤解析的状态
【发布时间】:2011-03-18 08:16:52
【问题描述】:

在我们公司,我们使用每个人都包含的基本 ant 文件来进行构建。它包含我们想要全局和统一定义的东西,比如构建测试、测试覆盖、构建发布、在 ivy 上发布等。

我想强制在为创建发布版本所做的常春藤解析中,具有测试(集成)状态的库被拒绝。基本上,对于发布版本,您只能使用发布类库。

但是,我找不到在 ivy resolve ant 任务(不是在 ivy.xml 文件中)强制执行此操作的方法。

有人知道如何做到这一点吗?

【问题讨论】:

    标签: ant build-process ivy


    【解决方案1】:

    选项 1

    严格来说,您有两组已解析的库,因此这可以通过拥有两个 ivy 文件来解决。一个列出对最新集成修订版的依赖关系,另一个列出最新发布版本。

    build.xml 文件将有两个解析目标,由发布属性控制

    <target name="resolve-int" unless="release.build">
        <ivy:resolve file="ivy-int.xml"/>
    </target>
    
    <target name="resolve-rel" if="release.build">
        <ivy:resolve file="ivy-rel.xml"/>
    </target>
    
    <target name="resolve" depends="resolve-int,resolve-rel"/>
    

    选项 2

    使用属性来确定所需的动态修订:

    ivy.xml

    <ivy-module version="2.0">
        <info organisation="com.myspotontheweb" module="demo"/>
        <dependencies>
            <dependency org="commons-lang" name="commons-lang" rev="${dynamic.revision}"/>
        </dependencies>
    </ivy-module>
    

    build.xml

    dynamic.revision 属性的默认值为 latest.integration

    <project xmlns:ivy="antlib:org.apache.ivy.ant" name="demo-ivy" default="resolve">
    
        <property name="dynamic.revision" value="latest.integration"/>
    
        <target name="resolve">
            <ivy:resolve/>
        </target>
    
        ..    
    
    </project>
    

    然后发布版本将覆盖此值,可能来自命令行,如下所示:

    ant -Ddynamic.revision=latest.release
    

    【讨论】:

    • 确实可行;但是这两种情况都限制了常春藤文件的格式。我面临的问题是我没有编写常春藤文件(所以我不能确定有两个文件,或者它们引用了一个属性)。整个想法是能够设置规则,如果提供的 ivy 文件不符合,则触发错误。但是常春藤文件是由其他人提供的。
    • 在这种情况下,请使用选项 2 和脚本,该脚本首先根据您要强制执行的一组业务规则验证 ivy.xml。
    • IVy 并非旨在验证它自己的内容。在我看来,您真正需要的是与常春藤作者商定一些规则,然后通过 XML 验证强制执行它们。我用来强制执行 XML 内容的一个这样的验证引擎是 schematron.com
    • 好的,我试试。这基本上是一个问题,常春藤是否可以自己做到这一点。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2013-07-13
    • 2016-04-27
    • 1970-01-01
    • 2013-08-17
    • 2011-08-19
    • 2011-04-05
    • 2013-05-31
    相关资源
    最近更新 更多