是否有一种通用的方法来访问 ANT 任务的结果文件集?
Is there a common way to access the resulting fileset of an ANT task?
我正在尝试编写集成 <zip>
任务的替代品,以便它支持使用 <exec>
和 7za.exe
的密码。这个想法是直接替换 <zip>
任务。
困难在于,<zip>
支持多种方式来声明哪些文件要 include/exclude,例如:
includes
includesfile
excludes
excludesfile
defaultexcludes
- 和嵌套的
<fileset>
声明
有没有办法在 exec 任务中使用这些 fileset
指令的结果?
未记录的属性 ${toString:filesetid}
有所有文件,默认分隔符是';'。
要转换分隔符使用pathconvert task,结果属性 将包含带有所选分隔符 f.e 的文件。 :
<fileset dir="C:/diff1" includes="**/*.html" id="diff">
<different targetdir="C:/diff2"
ignoreFileTimes="true"/>
</fileset>
<!-- one file one line -->
<pathconvert refid="diff" pathsep="${line.separator}" property="htmldiff"/>
<!-- blank as separator -->
<pathconvert refid="diff" pathsep=" " property="htmldiff"/>
<echo file="C:/diff1/htmldiff.txt">${htmldiff}</echo>
用于带有 arg 行的 exec,空白作为分隔符似乎是合适的。
基于 answer 我能够想出一个类似于集成 <zip>
任务的解决方案。使用 <pathconvert>
和单引号就可以了:
<macrodef name="sevenzip" description="Command line interface for 7zip">
<attribute name="level" default="5"/> <!-- will be ignored for now, just to make it compatible with normal ZIP task -->
<attribute name="basedir"/>
<attribute name="excludes" default=""/>
<attribute name="includes" default="**/**"/>
<attribute name="destfile"/>
<attribute name="password" default=""/>
<sequential>
<description>7-Zip integration</description>
<local name="passArg" />
<if>
<equals arg1="@{password}" arg2=""/>
<then>
<property name="passArg" value="" />
</then>
<else>
<!-- p<SECRET> = set password of archive -->
<property name="passArg" value='"-p@{password}"' />
</else>
</if>
<fileset id="mask" dir="@{basedir}">
<include name="@{includes}" />
<exclude name="@{excludes}" />
</fileset>
<local name="mask" />
<pathconvert property="mask" refid="mask" pathsep="' '" />
<!-- the single quotes help to wrap file names containing spaces -->
<exec executable="${7zip.cmd}" failonerror="true">
<!-- command -->
<arg value="a"/> <!-- a : add files to archive -->
<!-- arg value="u"/ --> <!-- u : update files to archive -->
<!-- switches -->
<arg value="-bd"/> <!-- -bd : disable percentage indicator -->
<arg value="-tzip"/> <!-- -t<type> : set type of archive -->
<arg value="${passArg}"/>
<arg value="--"/> <!-- : Stop switches parsing -->
<!-- archive file -->
<arg value="@{destfile}"/>
<!-- file names / wildcards -->
<arg line="'${mask}'"/>
<!--
the single quotes are the outter wrapper for the single quotes
from pathconvert, the line attribute add the result to the arguments
but NOT as a single escaped string
-->
</exec>
</sequential>
</macrodef>
我正在尝试编写集成 <zip>
任务的替代品,以便它支持使用 <exec>
和 7za.exe
的密码。这个想法是直接替换 <zip>
任务。
困难在于,<zip>
支持多种方式来声明哪些文件要 include/exclude,例如:
includes
includesfile
excludes
excludesfile
defaultexcludes
- 和嵌套的
<fileset>
声明
有没有办法在 exec 任务中使用这些 fileset
指令的结果?
未记录的属性 ${toString:filesetid}
有所有文件,默认分隔符是';'。
要转换分隔符使用pathconvert task,结果属性 将包含带有所选分隔符 f.e 的文件。 :
<fileset dir="C:/diff1" includes="**/*.html" id="diff">
<different targetdir="C:/diff2"
ignoreFileTimes="true"/>
</fileset>
<!-- one file one line -->
<pathconvert refid="diff" pathsep="${line.separator}" property="htmldiff"/>
<!-- blank as separator -->
<pathconvert refid="diff" pathsep=" " property="htmldiff"/>
<echo file="C:/diff1/htmldiff.txt">${htmldiff}</echo>
用于带有 arg 行的 exec,空白作为分隔符似乎是合适的。
基于 answer 我能够想出一个类似于集成 <zip>
任务的解决方案。使用 <pathconvert>
和单引号就可以了:
<macrodef name="sevenzip" description="Command line interface for 7zip">
<attribute name="level" default="5"/> <!-- will be ignored for now, just to make it compatible with normal ZIP task -->
<attribute name="basedir"/>
<attribute name="excludes" default=""/>
<attribute name="includes" default="**/**"/>
<attribute name="destfile"/>
<attribute name="password" default=""/>
<sequential>
<description>7-Zip integration</description>
<local name="passArg" />
<if>
<equals arg1="@{password}" arg2=""/>
<then>
<property name="passArg" value="" />
</then>
<else>
<!-- p<SECRET> = set password of archive -->
<property name="passArg" value='"-p@{password}"' />
</else>
</if>
<fileset id="mask" dir="@{basedir}">
<include name="@{includes}" />
<exclude name="@{excludes}" />
</fileset>
<local name="mask" />
<pathconvert property="mask" refid="mask" pathsep="' '" />
<!-- the single quotes help to wrap file names containing spaces -->
<exec executable="${7zip.cmd}" failonerror="true">
<!-- command -->
<arg value="a"/> <!-- a : add files to archive -->
<!-- arg value="u"/ --> <!-- u : update files to archive -->
<!-- switches -->
<arg value="-bd"/> <!-- -bd : disable percentage indicator -->
<arg value="-tzip"/> <!-- -t<type> : set type of archive -->
<arg value="${passArg}"/>
<arg value="--"/> <!-- : Stop switches parsing -->
<!-- archive file -->
<arg value="@{destfile}"/>
<!-- file names / wildcards -->
<arg line="'${mask}'"/>
<!--
the single quotes are the outter wrapper for the single quotes
from pathconvert, the line attribute add the result to the arguments
but NOT as a single escaped string
-->
</exec>
</sequential>
</macrodef>