应用

名称 execon弃用,仅保留以提供向后兼容性。

描述

执行系统命令。当指定了 os 属性时,该命令仅在 Apache Ant 在指定的操作系统之一上运行时执行。

多个 资源集合(包括但不限于 FileSetDirSet自 Ant 1.6 起)或 FileList自 Ant 1.6 起))的文件和/或目录作为参数传递给系统命令。

如果指定了嵌套的 mapper,则会将每个源文件的日期戳与由嵌套的 mapper 元素定义的目标文件的日期戳进行比较,并在指定的 dest 中搜索目标文件。

至少需要一个 filesetfilelist,并且您不能指定多个 mapper

请注意,您无法与分叉的程序进行交互,向其发送输入的唯一方法是通过 inputinputstring 属性。

在 Unix(类 Unix)系统上将 Ant 作为后台进程运行

如果将 Ant 作为后台进程运行(例如 ant &)并使用 <apply> 任务并将 spawn 设置为 false,则必须向分叉的进程提供显式输入,否则 Ant 将被挂起,因为它会尝试从标准输入读取。

参数

属性 描述 必需
executable 要执行的命令,不带任何命令行参数。
dest 执行命令时,命令预期放置目标文件的目录。 否;除非指定了嵌套的 mapper,否则将被忽略;默认情况下,mapper 返回的目标文件名将被解释为绝对路径
spawn 是否要生成命令。
如果生成命令,则 Ant 不会记录其输出。
在生成进程时,输入、输出、错误和结果属性设置无效。
自 Ant 1.6 起
否;默认值为 false
dir 应该在其中执行命令的目录。 否;如果 vmlaunchertrue,则默认为当前工作目录,否则为项目的 basedir
relative 文件名是否应作为相对路径名传递到命令行(相对于相应 fileset/list 的基本目录(对于源文件)或 dest 属性(对于目标文件))。 否;默认值为 false
forwardslash 文件名是否应使用正斜杠传递,即使操作系统需要其他文件分隔符。如果系统文件分隔符是正斜杠,则会忽略此选项。 否;默认值为 false
os 可以在其上执行命令的操作系统列表。
osfamily <os> 条件中使用的操作系统系列。自 Ant 1.7 起
output 应将命令的输出重定向到的文件。如果错误流也没有重定向到文件或属性,它将出现在此输出中。
error 应将命令的标准错误重定向到的文件。自 Ant 1.6 起
logError 当您希望在 Ant 的日志中看到错误输出并且将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果使用 errorerrorProperty 属性重定向错误,则此属性将无效。自 Ant 1.6 起
append 输出是否应追加到现有文件或覆盖现有文件。如果将 parallel 设置为 false,则您可能希望将此属性设置为 true 否;默认值为 false
outputproperty 应在其中存储命令输出的属性的名称。除非错误流重定向到单独的文件或流,否则此属性将包含错误输出。
errorproperty 应在其中存储命令的标准错误的属性的名称。自 Ant 1.6 起
input 从中获取执行命令的标准输入的文件。此属性与 inputstring 属性互斥。自 Ant 1.6 起
inputstring 用作执行命令的输入流的字符串。此属性与 input 属性互斥。自 Ant 1.6 起
resultproperty 应在其中存储命令的返回代码的属性的名称。仅在 failonerrorfalse 时才感兴趣。如果将 parallel 设置为 false,则只存储第一次执行的结果。
timeout 如果命令在指定时间(以毫秒为单位)内未完成,则停止命令。
failonerror 如果命令以非 0 的返回代码退出,则停止构建过程。 否;默认值为 false
failifexecutionfails 如果我们无法启动程序,则停止构建。 否;默认值为 true
skipemptyfilesets 如果未找到源文件或源文件比其相应目标文件更新,则不运行命令。尽管其名称如此,但此属性也适用于文件列表。 否;默认值为 false
parallel 仅运行一次命令,将所有文件作为参数追加。如果为 false,则将为每个文件执行一次命令。 否;默认值为 false
type filedirboth 之一。如果设置为 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> 元素来定义此任务的文件,并引用在其他地方定义的 <fileset>

filelist

自 Ant 1.6 起

您可以使用任意数量的嵌套 <filelist> 元素来定义此任务的文件,并引用在其他地方定义的 <filelist>

dirset

自 Ant 1.6 起

您可以使用任意数量的嵌套 <dirset> 元素来定义此任务的目录,并引用在其他地方定义的 <dirset>

任何其他 资源集合

自 Ant 1.7 起

您可以使用任意数量的嵌套资源集合。

mapper

单个 <mapper> 指定相对于 dest 属性的依赖项检查的目标文件。如果指定了 dest 属性,它将用作解析 mapper 返回的相对路径名的基本目录。至少需要一个 <fileset><filelist>

arg

命令行参数应指定为嵌套的 <arg> 元素。请参阅 命令行参数

srcfile

默认情况下,源文件的文件名将添加到命令行的末尾(除非您将 addsourcefile 设置为 false)。如果您需要将其放置在其他位置,请在 <arg> 元素之间使用嵌套的 <srcfile> 元素来标记插入点。

属性 描述 必需
prefix 在构建命令行参数时,放置在文件名前面的前缀。自 Ant 1.8.0 起
suffix 在构建命令行参数时,追加到文件名的后缀。自 Ant 1.8.0 起

targetfile

<targetfile><srcfile> 类似,并标记命令行上目标文件名的位置。如果省略,则目标文件名将根本不会添加到命令行中。仅当您还定义了嵌套的 mapper 时,才能指定此元素。

属性 描述 必需
prefix 在构建命令行参数时,放置在文件名前面的前缀。自 Ant 1.8.0 起
suffix 在构建命令行参数时,追加到文件名的后缀。自 Ant 1.8.0 起

env

可以通过嵌套的 <env> 元素指定要传递给系统命令的环境变量。请参阅有关 exec 的部分中的描述

redirector

自 Ant 1.6.2 起

可以指定嵌套的 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>