因此,我们有一些文件名需要在很多地方使用,但是我们强烈希望只列出一个地方列出这些名称,以避免使列表不同步。为此,我们使用patternset
任务:
<!-- the number of files here can change wildly -->
<patternset id="pattern.of.specific.files">
<include name="specific-file-#1"/>
<include name="specific-file-#2"/>
<include name="specific-file-#3"/>
</patternset>
我们在其他地方构建fileset
,因为这些文件可能位于多个位置,并且这些位置是通过程序确定的:
<fileset id="fileset.of.specific.files" dir="${... this changes ...}">
<patternset refid="pattern.of.specific.files"/>
</fileset>
<fileset id="fileset where stuff is going" dir="${... some other place ...}">
<patternset refid="pattern.of.specific.files"/>
</fileset>
然后我们可以在构建fileset
或path
或其他任何东西时使用这些copy
。 所有这些都很好。
我们现在需要将该文件名列表传递给外部程序。我的第一次尝试是
<!-- we have several calls to this program already
so we wrapped it in its own task -->
<task.for.running.the.external.program>
<arg value="${pattern.of.specific.files}"/>
</task.for.running.the.external.program>
知道多个name
都将作为单个字符串传递到接收程序的参数向量中-很好,我们可以将其拆分为空白或其他任何内容。
那没有用。该程序将文字字符串${pattern.of.specific.files}
作为其参数。叹气。
我的下一个尝试使用了“真正需要更好地记录此文档”功能:
<arg value="${toString:pattern.of.specific.files}"/>
那...行得通。传递的字符串为
patternSet{ includes: [specific-file-#1, specific-file-#2, specific-file-#3] excludes: [] }
好的,如果没有更好的方法,可以使 起作用。坦白说,那太可怕了。
我坚信可以通过一定程度的间接解决所有计算机科学问题的公理。因此,我尝试echo
将列表添加到具有固定名称的临时文件中,然后让外部程序仅从该文件中读取文件名:
<echo file=" some known name goes here ">
${toString:pattern.of.specific.files}
</echo>
同一patternSet{ includes....
已写入文件。我应该有这个期望。
是否存在可以将patternset
乘refid
并发出名称的 ?是文件,还是属性,或其他 else ,然后我们可以使用标准的“ $ {property_name}”扩展名将其转换为值,而无需包含toString
中的所有多余文本?可能有一个任务。也许还有toString
以外的一些财产助手?
我的一位同事开玩笑说,使用sed
从Ant构建文件中简单提取<include name=.../>
行,并从每行中引用的内容可能更干净。它开始吸引我了。