Dynamically updating Ivy extra attributes

旧巷老猫 提交于 2019-12-11 12:12:24

问题


I plan on using extra attributes in the ivy.xml files in an attempt to be able to get access to the revision number parts, which I need to do so that I can then use those values for the resolver pattern in the ivysettings.xml file:

<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>

I want to dynamically update the shortrev and buildnum extra attribute during the build so that when this module gets published their values will be saved with it and also so that I can use those extra attributes in the ivysettings.xml file for the resolver pattern.

<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>

It was suggested that I could try to use properties within the Ivy file to dynamically set their values, but I'm not clear on how to go about doing that.


回答1:


This example uses the standard buildnumber task from ANT. Unfortunately the ivy buildnumber task will not resolve properly for modules with extra attributes in the resolver definition :-(

Example

$ 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>

Notes:

  • The extra attributes are associated with both the info and artifact definitions.

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>

Notes:

  • The ivy deliver task ensures that the published ivy file is properly populated.

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>

Notes:

  • I always setup Maven Central as my default resolver, in order to retrieve 3rd party dependencies like commons-lang and junit.
  • The custom.repository resolver is configured within the build file as the property "publish.resolver"


来源:https://stackoverflow.com/questions/10372106/dynamically-updating-ivy-extra-attributes

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!