>为了消除我的 antbuild.xml
文件中的冗余,我决定将重复的目标分解到mytargets.xml
文件中,将其发布到工件存储库,然后按以下方式导入它:
<import>
<url url="http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml"/>
</import>
我不喜欢这种方法的两点:
mytargets-1.2.3.xml
永远不会出现在磁盘上我可以轻松查看它的任何位置。我绝对需要访问 http://mycompany.com/artifacts 才能在项目中做任何事情---它完全破坏了离线工作。
因此,我尝试创建一个setup
目标来获取mytargets.xml
的本地副本,并调整了我的<import>
以使用此本地副本。
<import file="${basedir}/antlib/mytargets/mytargets.xml"/>
但是,正如您可能已经猜到的那样,在以这种方式调整<import>
后,我什至无法执行我的目标setup
,因为该文件尚不存在:
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
向<import>
添加optional="true"
只会将问题推迟到依赖于mytargets.xml
的第一个目标。
我看了 https://ant.apache.org/manual/Types/antlib.html,但这种方法似乎不允许您定义<target>
。
那么,某人如何在多个项目之间共享 ant XML 位呢? 我已经在以"一种真正的方式"做到这一点了吗? 或者,有没有更好的方法?
如果您主要只是想避免在本地副本已经可用时下载远程副本,则可以尝试如下操作:
<condition property="mytargets.xml.available">
<available file="${basedir}/antlib/mytargets/mytargets.xml" />
</condition>
<target name="setup" unless="mytargets.xml.available">
<get
src="http://mycompany.com/artifacts/mycompany.com/mytargets/1.2.3/mytargets-1.2.3.xml"
dest="${basedir}/antlib/mytargets"
/>
</target>
<target name="main" depends="setup">
<import file="${basedir}/antlib/mytargets/mytargets.xml" />
...
</target>
因此,在我看来,<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>
和<include>
不同,如果缺少mymacros.xml
,<taskdef>
不会立即导致构建失败,这使您有机会下载它。