1

リビジョン番号の部分にアクセスできるようにするために、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>

Ivy ファイル内のプロパティを使用して動的に値を設定することを試みることができると提案されましたが、それを行う方法については明確ではありません。

4

1 に答える 1

4

この例では、ANT の標準ビルド番号タスクを使用します。残念ながら、ivy buildnumberタスクは、リゾルバー定義に追加の属性を持つモジュールに対して適切に解決されません :-(

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

アイビー.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>

ノート:

  • 追加の属性は、情報定義とアーティファクト定義の両方に関連付けられています。

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配信タスクは、公開された 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>

ノート:

  • commons-lang や junit などのサードパーティの依存関係を取得するために、常に Maven Central をデフォルトのリゾルバーとしてセットアップします。
  • custom.repositoryリゾルバーは、ビルド ファイル内でプロパティ "publish.resolver" として構成されます。
于 2012-04-29T15:32:46.067 に答える