【问题标题】:Get Path of File from Ant Using Available使用 Available 从 Ant 获取文件路径
【发布时间】:2017-06-10 02:19:54
【问题描述】:

我使用的是 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 的方法可以让我获得这种期望的行为?

【问题讨论】:

    标签: java ant


    【解决方案1】:

    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。

    【讨论】:

    • 我对尝试使您提出的第三个选项(fileset 之一)工作非常感兴趣。如所写,由于我从/proj/common/math/ 文件夹运行ant build,因此文件集将其用作搜索的根,并且只会向下查找 build.root 文件(因此它总是失败)。我需要它走另一条路(朝向父目录)。需要灵活性,因为构建结构的位置会因开发人员的机器或持续集成机器而改变。有什么建议吗?
    • 如果是这种情况,您只需将文件集的dir 属性设置为相对路径,例如${basedir}/../..。更好的是,我会使用location="${basedir}/../.." 命名类似“project.root.dir”的属性来初始化脚本(即将此任务放在目标之外),然后您可以在需要指向该位置的任何时候使用它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2021-10-28
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多