Ant 使用 exec 目标编译 Coffee Scripts

Posted

技术标签:

【中文标题】Ant 使用 exec 目标编译 Coffee Scripts【英文标题】:Ant using the exec target to compile Coffee Scripts 【发布时间】:2011-10-02 23:35:43 【问题描述】:

我有一个使用了一些 Coffee Script 的 Ant 项目。我希望 Ant 编译所有的咖啡,而不是有另一个构建步骤来编译它。我要使用的咖啡命令行脚本,它将所有咖啡文件编译成同义的 js 文件(site.coffee 编译为 site.js,app.coffee 编译为 app.js):

coffee -c ./js/*.coffee

我创建了一个我认为会运行相同命令的 Ant 任务,但出现错误:

<target name="compilecoffee" description="Compiles coffeescript files">
    <exec executable="coffee">
        <arg value="-c $env.WORKSPACEjs/*.coffee" />
    </exec>
</target>

现在当我运行 ant compilecoffee -Denv.WORKSPACE=./ 时,我从 Coffee 收到以下错误:

Buildfile: /Users/dave/Workspace/ColdFusion/Mura-Themes/e123-1/build.xml

compilecoffee:
     [exec] 
     [exec] node.js:116
     [exec]         throw e; // process.nextTick error, or 'error' event on first tick
     [exec]         ^
     [exec] Error: unrecognized option: -c ./js/3_site.coffee
     [exec]     at OptionParser.parse (/Users/dave/local/lib/node/.npm/coffee-script/1.1.1/package/lib/optparse.js:34:17)
     [exec]     at /Users/dave/local/lib/node/.npm/coffee-script/1.1.1/package/lib/command.js:245:29
     [exec]     at Object.run (/Users/dave/local/lib/node/.npm/coffee-script/1.1.1/package/lib/command.js:24:5)
     [exec]     at Object.<anonymous> (/Users/dave/local/lib/node/.npm/coffee-script/1.1.1/package/bin/coffee:7:27)
     [exec]     at Module._compile (module.js:373:26)
     [exec]     at Object..js (module.js:379:10)
     [exec]     at Module.load (module.js:305:31)
     [exec]     at Function._load (module.js:271:10)
     [exec]     at Array.<anonymous> (module.js:392:10)
     [exec]     at EventEmitter._tickCallback (node.js:108:26)
     [exec] Result: 1

如果我运行,我的想法是直接在命令行 (coffee -c ./js/*.coffee) 运行咖啡等价物,我没有收到任何错误,一切都按预期工作。我是不是用错了 exec 目标?

【问题讨论】:

【参考方案1】:

试试 =

<arg line="-c $env.WORKSPACEjs/*.coffee" />

或对命令的每一部分使用一个 arg 值=...

<target name="compilecoffee" description="Compiles coffeescript files">
 <exec executable="coffee">
  <arg value="-c"/>
  <arg value="$env.WORKSPACEjs/*.coffee" />
 </exec>
</target>

咖啡可执行文件必须在路径上或使用 =

<exec executable="full/path/to/coffee">

编辑

正如 Dominic 指出的,'*' 不会被扩展,所以你应该使用 apply =

 <apply executable="coffee">
  <arg value="-c"/>
  <fileset dir="$env.WORKSPACEjs" includes="**/*.js"/>
 </apply>

见Ant Manual apply task f.e.您可以使用parallel="true",意味着只运行一次命令,将所有文件作为参数附加,如果可能的话用咖啡来加速它。

【讨论】:

+1。戴夫,你让 Ant 运行 coffee "-c ./js/3_site.coffee";空格是参数的一部分,而不是分隔参数。 单独的 args 不起作用,因为 shell 不会扩展 glob。 Dominic,构建文件确实扩展了全局。如果我使用&lt;arg line="-c $env.WORKSPACEjs/*.coffee" /&gt;,我会得到预期的结果。所有 CoffeeScript 文件都被编译成单独的 javascript 文件。到目前为止,我只测试了一个 coffeescript 文件,所以如果我添加多个文件可能会失败。 好的,所以 arg line=... 似乎可以工作,但是使用 apply 任务可能会显着加快速度,当您需要编译大量文件时,只需使用 parallel="true" Dominics注释与 arg 值的使用有关,这是推荐的方式,因为 arg 行有时会出现问题,因此根据经验,应该更喜欢 arg 值而不是 arg 行【参考方案2】:

实际上,您可以通过以下方式实现:

<target name="compile-coffee" description="Compiles coffeescript into the javascript dir">
  <exec executable="coffee">
    <arg value="-c" />
    <arg value="--output" />
    <arg value="$javascript_dir" />
    <arg value="$cofeescript_dir" />
  </exec>
</target>

其中 javascript_dir 指向您的 js 目录(目标),而 coffeescript_dir 指向您的 coffeescript 目录(源)。

*当然,如果您只想就地编译,可以省略 --output 和 javascript_dir。

【讨论】:

以上是关于Ant 使用 exec 目标编译 Coffee Scripts的主要内容,如果未能解决你的问题,请参考以下文章

执行:显示标准输出“直播”

如何从 Ant 'exec' 任务中导出环境变量?

ant 到 maven 的转换:正确的方法?

ant exec

如何在 Ant 构建任务中使用 -Xlint:unchecked 重新编译?

如果 exec 任务失败,如何使 ant 脚本失败