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,构建文件确实扩展了全局。如果我使用<arg line="-c $env.WORKSPACEjs/*.coffee" />
,我会得到预期的结果。所有 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的主要内容,如果未能解决你的问题,请参考以下文章