名称 execon
已弃用,仅保留以提供向后兼容性。
执行系统命令。当指定了 os 属性时,该命令仅在 Apache Ant 在指定的操作系统之一上运行时执行。
多个 资源集合(包括但不限于 FileSet、DirSet(自 Ant 1.6 起)或 FileList(自 Ant 1.6 起))的文件和/或目录作为参数传递给系统命令。
如果指定了嵌套的 mapper,则会将每个源文件的日期戳与由嵌套的 mapper
元素定义的目标文件的日期戳进行比较,并在指定的 dest 中搜索目标文件。
至少需要一个 fileset
或 filelist
,并且您不能指定多个 mapper
。
请注意,您无法与分叉的程序进行交互,向其发送输入的唯一方法是通过 input 和 inputstring 属性。
如果将 Ant 作为后台进程运行(例如 ant &)并使用 <apply>
任务并将 spawn 设置为 false
,则必须向分叉的进程提供显式输入,否则 Ant 将被挂起,因为它会尝试从标准输入读取。
属性 | 描述 | 必需 |
---|---|---|
executable | 要执行的命令,不带任何命令行参数。 | 是 |
dest | 执行命令时,命令预期放置目标文件的目录。 | 否;除非指定了嵌套的 mapper,否则将被忽略;默认情况下,mapper 返回的目标文件名将被解释为绝对路径 |
spawn | 是否要生成命令。 如果生成命令,则 Ant 不会记录其输出。 在生成进程时,输入、输出、错误和结果属性设置无效。 自 Ant 1.6 起 |
否;默认值为 false |
dir | 应该在其中执行命令的目录。 | 否;如果 vmlauncher 为 true,则默认为当前工作目录,否则为项目的 basedir |
relative | 文件名是否应作为相对路径名传递到命令行(相对于相应 fileset/list 的基本目录(对于源文件)或 dest 属性(对于目标文件))。 | 否;默认值为 false |
forwardslash | 文件名是否应使用正斜杠传递,即使操作系统需要其他文件分隔符。如果系统文件分隔符是正斜杠,则会忽略此选项。 | 否;默认值为 false |
os | 可以在其上执行命令的操作系统列表。 | 否 |
osfamily | <os> 条件中使用的操作系统系列。自 Ant 1.7 起 |
否 |
output | 应将命令的输出重定向到的文件。如果错误流也没有重定向到文件或属性,它将出现在此输出中。 | 否 |
error | 应将命令的标准错误重定向到的文件。自 Ant 1.6 起 | 否 |
logError | 当您希望在 Ant 的日志中看到错误输出并且将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果使用 error 或 errorProperty 属性重定向错误,则此属性将无效。自 Ant 1.6 起 | 否 |
append | 输出是否应追加到现有文件或覆盖现有文件。如果将 parallel 设置为 false,则您可能希望将此属性设置为 true。 |
否;默认值为 false |
outputproperty | 应在其中存储命令输出的属性的名称。除非错误流重定向到单独的文件或流,否则此属性将包含错误输出。 | 否 |
errorproperty | 应在其中存储命令的标准错误的属性的名称。自 Ant 1.6 起 | 否 |
input | 从中获取执行命令的标准输入的文件。此属性与 inputstring 属性互斥。自 Ant 1.6 起 | 否 |
inputstring | 用作执行命令的输入流的字符串。此属性与 input 属性互斥。自 Ant 1.6 起 | 否 |
resultproperty | 应在其中存储命令的返回代码的属性的名称。仅在 failonerror 为 false时才感兴趣。如果将 parallel 设置为 false,则只存储第一次执行的结果。 |
否 |
timeout | 如果命令在指定时间(以毫秒为单位)内未完成,则停止命令。 | 否 |
failonerror | 如果命令以非 0的返回代码退出,则停止构建过程。 |
否;默认值为 false |
failifexecutionfails | 如果我们无法启动程序,则停止构建。 | 否;默认值为 true |
skipemptyfilesets | 如果未找到源文件或源文件比其相应目标文件更新,则不运行命令。尽管其名称如此,但此属性也适用于文件列表。 | 否;默认值为 false |
parallel | 仅运行一次命令,将所有文件作为参数追加。如果为 false,则将为每个文件执行一次命令。 |
否;默认值为 false |
type | file 、dir 或 both 之一。如果设置为 file ,则仅将普通文件的名称发送到命令。如果设置为 dir ,则仅考虑目录的名称。注意:type 属性不适用于嵌套的 dirset ——dirset 始终隐式地将类型假定为 dir 。 |
否;默认值为 file |
newenvironment | 当指定了新的环境变量时,不要传播旧环境。 | 否;默认值为 false |
vmlauncher | 在可用时,使用 JVM 的执行工具运行命令。如果设置为 false,则将使用底层操作系统的 shell,无论是直接使用还是通过 antRun 脚本使用。在某些操作系统下,这可以访问通过 JVM 通常无法访问的功能,包括在 Windows 下能够执行脚本而不是其关联的解释器。如果要将可执行文件的名称指定为相对于 dir 属性给出的目录的相对路径,则可能需要将 vmlauncher 设置为 false。 |
否;默认值为 true |
resolveExecutable | 当此属性为 true时,可执行文件的名称首先会相对于项目 basedir 解析,如果不存在,则会相对于执行目录(如果指定)解析。在 Unix 系统上,如果只想允许执行用户路径中的命令,则将其设置为 false。自 Ant 1.6 起 |
否;默认值为 false |
maxparallel | 通过一次最多传递这么多源文件来限制并行程度。将其设置为负整数表示无限制。自 Ant 1.6 起。 | 否,默认情况下无限制 |
addsourcefile | 是否应自动将源文件名添加到命令中。自 Ant 1.6 起。 | 否;默认值为 true |
verbose | 是否在执行后打印摘要。自 Ant 1.6 起。 | 否;默认值为 false |
ignoremissing | 是否忽略通过文件列表指定的不存在的文件。自 Ant 1.6.2 起。 | 否;默认值为 true |
force | 是否绕过目标文件的日期戳比较。自 Ant 1.6.3 起。 | 否;默认值为 false |
discardOutput | 输出是否应完全被丢弃。此设置与将输出重定向到文件或属性的任何设置不兼容。 如果将其设置为 true,则错误输出也将被丢弃,除非您将错误输出重定向到文件、属性或启用 logError。自 Ant 1.10.10 起 |
否;默认值为 false |
discardError | 错误输出是否应完全被丢弃。此设置与将错误输出重定向到文件或属性的任何设置以及 logError不兼容。自 Ant 1.10.10 起 |
否;默认值为 false |
您可以使用任意数量的嵌套 <fileset>
元素来定义此任务的文件,并引用在其他地方定义的 <fileset>
。
自 Ant 1.6 起
您可以使用任意数量的嵌套 <filelist>
元素来定义此任务的文件,并引用在其他地方定义的 <filelist>
。
自 Ant 1.6 起
您可以使用任意数量的嵌套 <dirset>
元素来定义此任务的目录,并引用在其他地方定义的 <dirset>
。
自 Ant 1.7 起
您可以使用任意数量的嵌套资源集合。
单个 <mapper>
指定相对于 dest 属性的依赖项检查的目标文件。如果指定了 dest 属性,它将用作解析 mapper 返回的相对路径名的基本目录。至少需要一个 <fileset>
或 <filelist>
。
命令行参数应指定为嵌套的 <arg>
元素。请参阅 命令行参数。
默认情况下,源文件的文件名将添加到命令行的末尾(除非您将 addsourcefile 设置为 false
)。如果您需要将其放置在其他位置,请在 <arg>
元素之间使用嵌套的 <srcfile>
元素来标记插入点。
属性 | 描述 | 必需 |
---|---|---|
prefix | 在构建命令行参数时,放置在文件名前面的前缀。自 Ant 1.8.0 起 | 否 |
suffix | 在构建命令行参数时,追加到文件名的后缀。自 Ant 1.8.0 起 | 否 |
<targetfile>
与 <srcfile>
类似,并标记命令行上目标文件名的位置。如果省略,则目标文件名将根本不会添加到命令行中。仅当您还定义了嵌套的 mapper 时,才能指定此元素。
属性 | 描述 | 必需 |
---|---|---|
prefix | 在构建命令行参数时,放置在文件名前面的前缀。自 Ant 1.8.0 起 | 否 |
suffix | 在构建命令行参数时,追加到文件名的后缀。自 Ant 1.8.0 起 | 否 |
可以通过嵌套的 <env>
元素指定要传递给系统命令的环境变量。请参阅有关 exec 的部分中的描述
可以指定嵌套的 I/O 重定向器。<apply> 的行为类似于 exec 关于重定向器的行为,区别在于,在非 parallel 模式下,文件映射将在每次迭代时发生。这使用户能够从不同的文件接收输入,并向不同的文件发送输出,以用于每个源文件。
在 parallel 模式下,重定向器将为每个执行批次(maxparallel > 0)重置,并且 null 将用作源文件,就像在 exec
的情况下一样。
调用 ls -l,将 /tmp 下所有不以 .txt 结尾的文件的绝对文件名以及具有 id other.files 的 FileSet 的所有文件添加到命令行。
<apply executable="ls"> <arg value="-l"/> <fileset dir="/tmp"> <patternset> <exclude name="**/*.txt"/> </patternset> </fileset> <fileset refid="other.files"/> </apply>
为 /tmp 中的每个文件调用 somecommand arg1 SOURCEFILENAME arg2,将 SOURCEFILENAME
替换为每个文件的绝对文件名。如果 parallel 设置为 true
,则 SOURCEFILENAME
将被替换为用空格分隔的所有文件的绝对文件名。
<apply executable="somecommand" parallel="false"> <arg value="arg1"/> <srcfile/> <arg value="arg2"/> <fileset dir="/tmp"/> </apply>
对于每个比对应 .o 文件更新的 .c 文件,执行命令 cc -c -o TARGETFILE SOURCEFILE。其中,TARGETFILE
替换为 .o 文件的绝对路径,SOURCEFILE
替换为 .c 文件的绝对路径。
<apply executable="cc" dest="src/C" parallel="false"> <arg value="-c"/> <arg value="-o"/> <targetfile/> <srcfile/> <fileset dir="src/C" includes="*.c"/> <mapper type="glob" from="*.c" to="*.o"/> </apply>
将虚拟可执行文件 processfile 应用于 src 目录中所有匹配 *.file 的文件。<mapper>
被设置为将 *.file 映射到 *.out,然后该 <mapper>
用于为该 <apply>
任务指定 targetfile
。然后,对 out 的引用被用作嵌套在 <redirector>
中的 <outputmapper>
,而 <redirector>
又嵌套在该 <apply>
实例之下。这使我们能够对输出文件(在本例中为目标文件)执行依赖关系检查。
<mapper id="out" type="glob" from="src${file.separator}*.file" to="dest${file.separator}*.out"/> <apply executable="processfile" dest="dest"> <fileset dir="src" includes="*.file"/> <mapper refid="out"/> <redirector> <outputmapper refid="out"/> </redirector> </apply>
将 ls 可执行文件应用于 PATH
中的所有目录,有效地列出 PATH
上可用的所有可执行文件。
<apply executable="ls" parallel="true" force="true" dest="${basedir}" append="true" type="both"> <path> <pathelement path="${env.PATH}"/> </path> <identitymapper/> </apply>
使用命令 jsmin < src/a.js > dest/a.js 转换 src 目录中的所有 JavaScript 文件。由于文件名本身不应传递给 jsmin
程序,因此将 addsourcefile 设置为 false
。
<apply executable="jsmin" addsourcefile="false"> <!-- Collect the JS-files --> <fileset dir="src" includes="*.js"/> <redirector> <!-- redirect STDIN; fileset collects relative to its dir, but we need --> <!-- relative to basedir --> <inputmapper type="glob" from="*" to="src/*"/> <!-- redirect STDOUT to file in dest-dir --> <outputmapper id="out" type="glob" from="*.js" to="dest/*.js"/> </redirector> </apply>