【问题标题】:Dynamically updating Ivy extra attributes动态更新 Ivy 额外属性
【发布时间】:2012-04-29 23:37:58
【问题描述】:

我计划在 ivy.xml 文件中使用额外的属性,以便能够访问修订号部分,我需要这样做以便我可以在 ivysettings 中将这些值用于解析器模式.xml 文件:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:e="http://ant.apache.org/ivy/extra" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info organisation="MyCompany" module="MyModule" revision="1.2.3.4" e:shortrev="1.2.3" e:buildnum="4" publication="20120207140052" />
    ...
</ivy-module>

我想在构建过程中动态更新 shortrevbuildnum 额外属性,以便在发布此模块时,它们的值将与它一起保存,以便我可以将 ivysettings.xml 文件中的这些额外属性用于解析器模式。

<resolvers>
    <filesystem name="fs.resolver">
        <ivy pattern="${my.dir}/[organisation]/[module]/[shortrev]/[buildnum]/ivy.xml" />
        <artifact pattern="${my.dir}/[organisation]/[module]/[shortrev]/[buildnum]/[artifact].[ext]" />
    </filesystem>
</resolvers>

suggested 我可以尝试使用 Ivy 文件中的属性来动态设置它们的值,但我不清楚如何去做。

【问题讨论】:

    标签: ant ivy


    【解决方案1】:

    此示例使用来自 ANT 的标准 buildnumber 任务。不幸的是,ivy buildnumber 任务无法正确解析解析器定义中具有额外属性的模块:-(

    示例

    $ tree
    .
    |-- build.xml
    |-- ivysettings.xml
    |-- ivy.xml
    `-- src
        `-- main
            `-- HelloWorld.java
    

    ivy.xml

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
        <info organisation="MyCompany" module="MyModule" e:shortrev="${publish.target.revision}" e:buildnum="${publish.buildnumber}"/>
    
        <configurations defaultconfmapping="compile->default">
            <conf name="compile" description="Required to compile application"/>
            <conf name="runtime" description="Shared library needed at runtime" extends="compile"/>
            <conf name="test"    description="Required for test only" extends="runtime"/>
        </configurations>
    
        <publications>
            <artifact name="MyModule" type="jar" e:shortrev="${publish.target.revision}" e:buildnum="${publish.buildnumber}"/>
        </publications>
    
        <dependencies>
            <dependency org="commons-lang" name="commons-lang" rev="2.6"/>
            <dependency org="junit" name="junit" rev="4.8.2" conf="test->default"/>
        </dependencies>
    
    </ivy-module>
    

    注意事项:

    • 额外的属性与 both 信息和工件定义相关联。

    build.xml

    <project xmlns:ivy="antlib:org.apache.ivy.ant" name="publish-example" default="build">
    
        <!--
        ==========
        Properties
        ==========
        -->
        <property name="src.dir"     location="src/main"/>
        <property name="build.dir"   location="build"/>
        <property name="classes.dir" location="${build.dir}/classes"/>
        <property name="reports.dir" location="${build.dir}/reports"/>
    
        <property name="publish.target.revision" value="1.2.3"/>
        <property name="publish.status"   value="release"/>
        <property name="publish.resolver" value="custom.repository"/>
    
        <!--
        =======
        Targets
        =======
        -->
        <target name='init' description='Resolve project dependencies and set classpaths'>
            <ivy:resolve/>
            <ivy:report todir='${reports.dir}' graph='false' xml='false'/>
    
            <ivy:cachepath pathid="compile.path"  conf="compile"/>
            <ivy:cachepath pathid="runtime.path"  conf="runtime"/>
            <ivy:cachepath pathid="test.path"     conf="test"/>
    
            <mkdir dir="${classes.dir}"/>
        </target>
    
        <target name="compile" depends="init">
            <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" classpathref="compile.path"/>
        </target>
    
        <target name="build" depends="compile">
            <ivy:info/>
            <jar destfile="${build.dir}/${ivy.module}.jar" basedir="${classes.dir}"/>
        </target>
    
        <target name="publish-revision" description="Determine the new published revision">
            <buildnumber/>
    
            <property name="publish.revision" value="${publish.target.revision}.${build.number}"/>
            <property name="publish.buildnumber" value="${build.number}"/>
        </target>
    
        <target name="publish" depends="build,publish-revision" description="Publish artifacts into repository">
            <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="${publish.status}"/>
    
            <ivy:publish resolver="${publish.resolver}" pubrevision="${publish.revision}" overwrite="true">
                <artifacts pattern="${build.dir}/[artifact].[ext]"/>
            </ivy:publish>
        </target>
    
        <target name="clean" description="--> clean project files">
            <delete dir="${build.dir}"/>
        </target>
    
        <target name="clean-all" depends="clean" description="--> clean ivy cache">
            <ivy:cleancache />
        </target>
    
    </project>
    

    注意事项:

    • ivy deliver 任务可确保正确填充已发布的 ivy 文件。

    ivysettings.xml

    <ivysettings>
        <settings defaultResolver="central"/>
        <resolvers>
            <ibiblio name="central" m2compatible="true"/>
            <filesystem name="custom.repository">
                <ivy pattern="${ivy.settings.dir}/repository/[organisation]/[module]/[shortrev]/[buildnum]/ivy.xml" />
                <artifact pattern="${ivy.settings.dir}/repository/[organisation]/[module]/[shortrev]/[buildnum]/[artifact].[ext]" />
            </filesystem>
        </resolvers>
    </ivysettings>
    

    注意事项:

    • 我总是将 Maven Central 设置为我的默认解析器,以便检索第三方依赖项,例如 commons-lang 和 junit。
    • custom.repository 解析器在构建文件中配置为属性“publish.resolver”

    【讨论】:

    • 我认为这对我们来说可能工作得很好。您目前是否在构建系统中使用类似的东西?
    • 我使用 Nexus 作为我的存储库管理器。这意味着我的存储库格式是 Maven,而不是像您这样的自定义布局。常春藤的美妙之处在于它非常灵活。
    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2019-01-17
    • 2016-11-14
    • 2019-03-24
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多