首页 > 解决方案 > 在 ant 中,如何创建和使用目标“库”?

问题描述

为了消除我的 antbuild.xml文件中的冗余,我决定将重复的目标分解为mytargets.xml文件,将其发布到工件存储库,然后按以下方式导入:

<import>
    <url url="http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml"/>
</import>

这种方法有两点我喜欢:

  1. mytargets-1.2.3.xml永远不会出现在我可以轻松查看的磁盘上的任何位置。

  2. 我绝对需要访问http://mycompany.com/artifacts才能在项目中做任何事情——它完全破坏了离线工作。

因此,我尝试创建一个setup目标来获取本地副本mytargets.xml并调整我<import>以使用此本地副本。

<import file="${basedir}/antlib/mytargets/mytargets.xml"/>

但是,正如您可能已经猜到的那样,在以这种方式调整 my 后,我什至无法执行我setup的目标,<import>因为该文件尚不存在:

Buildfile: /home/me/myproject/build.xml

BUILD FAILED
/home/me/myproject/build.xml:265: Cannot find /home/me/myproject/antlib/mytargets/mytargets.xml imported from /home/me/myproject/build.xml

添加optional="true"<import>唯一将问题推迟到依赖的第一个目标mytargets.xml

我查看了https://ant.apache.org/manual/Types/antlib.html,但这种方法似乎不允许您定义<target>.

那么,有人如何在多个项目之间共享一些 ant XML?我是否已经以“一种真正的方式”去做了?或者,还有更好的方法?

标签: ant

解决方案


所以,在我看来,它<target>本质上是本地的,不打算重用。另一方面,<macrodef>似乎是为了重用。

这是“图书馆”,mymacros.xml

<?xml version="1.0"?>
<antlib>
    <macrodef name="mymacro">
        ...
    </macrodef>
</antlib>

这是客户,myproject/build.xml

<?xml version="1.0"?>
<project name="myproject">
    <target name="mytarget">
        <mymacro/>
    </target>
    <taskdef file="mymacros.xml"/>
</project>

<import>and不同,如果缺少<include><taskdef>不会导致构建立即失败mymacros.xml,这使您有机会下载它。


推荐阅读