使用可用

时间:2017-06-09 15:47:46

标签: java ant

我正在使用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的替代方案可以让我获得这种理想的行为?

1 个答案:

答案 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。