我正在使用Ant 1.10,如果文件存在,我需要从当前位置找到目录结构文件的路径。我们已经在构建环境中使用ant-contrib
,因此使用该推荐没有问题。
例如,我有以下目录结构:
~/repos/proj/
--/build.root
--/common/math/
--/build.xml
--/ivy.xml
--/build/tools/
--/build-shared.xml
--/ivy-stuff.xml
--/products/
--/prodA/
--/build.xml
--/ivy.xml
我需要检索的路径是~/repos/proj
作为绝对路径(我将此属性称为buildrootdir
)。然后,我创建一个由buildrootdir
构建的属性和build-shared.xml
的路径。目前,根路径被硬编码为一系列相对路径(../../../
)。我们很快就会进行代码重组,并且我希望通过“动态”查找来摆脱硬编码的相对路径。
我目前的解决方案是使用递归antcallback
到findroot.xml中设置属性的目标。我有一些逻辑限制搜索通过父目录,直到我达到根级别。它可以工作,但它会导致代码重复出wazoo - 每个build.xml都会有一个相邻的findroot.xml。否则,我有一个硬编码的相对路径到一个常见的findroot.xml文件,这会破坏我的目标。我不想要这样的东西:
~/repos/proj/
--/build.root
--/common/math/
--/build.xml
--/ivy.xml
--/findroot.xml
--/build/tools/
--/build-shared.xml
--/ivy-stuff.xml
--/findroot.xml
--/products/
--/prodA/
--/build.xml
--/ivy.xml
--/findroot.xml
我正在查看available
任务,并注意到我可以将“searchparents”标志设置为true,然后递归搜索。我可以用
<available property="found" file="build.root" filepath="${basedir}" searchparents="true"/>
这可以说该文件可用。但是,我不知道如何使用available获取它的路径。我看一下调试输出,我看到以下几行:
[available] Searching /home/user/repos/proj/common/math
[available] Found: build.root in /home/user/repos/proj
我查看了available doxygen甚至available source code,但似乎无法实现。
我错过了什么吗?是否有available
的替代方案可以让我获得这种理想的行为?
答案 0 :(得分:0)
property
任务有一个&#39;位置&#39;用于构建文件的规范路径的属性。
<property name="project.dir" location="build.root" />
但请注意,即使文件不存在,也会设置此属性,因此如果需要考虑的话,您必须做一些更复杂的事情。如果找不到文件,我不确定您是想要在构建中失败还是查看其他地方。
如果您想失败,可以使用available
作为条件:
<property name="project.dir" location="build.root" />
<fail message="build.root not found">
<condition>
<available file="${project.dir}" />
<condition>
</fail>
如果你只想找到它,无论它在哪里,我都会使用fileset
:
<fileset dir="${basedir}" includes="**/build.root" />
您可以使用resourcecount
任务断言只找到一个文件(假设这是您想要的)和pathconvert
如果您确实需要将文件设置为属性而不是路径参考。
为了记录,我建议尽可能避免使用ant-contrib。