为了消除我的ant build.xml
文件中的冗余,我决定将重复目标放在mytargets.xml
文件中,将其发布到工件存储库,然后按以下方式导入: / p>
<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"/>
但是,正如您可能已经猜到的那样,在以这种方式调整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?我是否已经采用了这种真正的方式&#39;?或者,有更好的方法吗?
答案 0 :(得分:0)
如果您在本地副本已经可用时主要是试图避免下载远程副本,您可以尝试这样的事情:
<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>
答案 1 :(得分:0)
因此,在我看来,<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>
不同,<taskdef>
如果缺少mymacros.xml
,则不会导致构建立即失败,这样您就有机会下载它。