>我正在使用 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
路径。目前,根的路径被硬编码为一系列相对路径(../../../
)。我们很快就会进行代码重组,我想通过"动态"查找来摆脱硬编码的相对路径。
我当前的解决方案是对 findroot 中设置属性的目标使用递归antcallback
.xml该目标。我有一些逻辑来限制通过父目录的搜索,直到我达到根级别。它可以工作,但它会导致代码重复 wazoo - 每个构建.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] Searching /home/user/repos/proj/common/math
[available] Found: build.root in /home/user/repos/proj
我已经查看了可用的doxygen甚至可用的源代码,这似乎是不可能的。
我错过了什么吗?除了available
之外,有没有其他方法可以让我获得这种期望的行为?
property
任务具有"位置"属性,用于构建文件的规范路径。
<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。