是否有任何关于将grunt与ant集成的好教程?我们当前的构建使用ant,因为我们是Java商店。然而,前端开始成为一流的公民,我们正在研究使用node和grunt进行前端构建。我需要将前端构建与ant构建集成。我需要知道如何规范化所有自定义任务的退出代码以及内置的grunt任务,并在ant调用grunt任务时将控制台输出限制为这些预定义代码。任何帮助将不胜感激。
答案 0 :(得分:14)
您可以使用此宏:
<macrodef name="exec-node">
<attribute name="module" description="The name of the NodeJS module to execute"/>
<attribute name="failonerror" default="true" description="Fail if the exit code is not 0"/>
<element name="args" implicit="yes" description="Argument to pass to the exec task"/>
<sequential>
<exec executable="cmd.exe" failonerror="@{failonerror}" osfamily="winnt">
<arg line="/c @{module}" />
<args/>
<!-- Windows cmd output workaround: http://stackoverflow.com/a/10359327/227349 -->
<!-- Forces node's stderror and stdout to a temporary file -->
<arg line=" > _tempfile.out 2<&1"/>
<!-- If command exits with an error, then output the temporary file -->
<!-- to stdout delete the temporary file and finally exit with error level 1 -->
<!-- so that the apply task can catch the error if @failonerror="true" -->
<arg line=" || (type _tempfile.out & del _tempfile.out & exit /b 1)"/>
<!-- Otherwise, just type the temporary file and delete it-->
<arg line=" & type _tempfile.out & del _tempfile.out &"/>
</exec>
<exec executable="@{module}" failonerror="@{failonerror}" osfamily="unix">
<args/>
</exec>
</sequential>
</macrodef>
你可以调用任何命令:例如:
<target name="jshint">
<exec-node module="grunt">
<arg value="jshint" />
</exec-node>
</target>
就像一个魅力:也确保打印stderr,这是调用grunt时的常见问题。
答案 1 :(得分:2)
Grunt可以调用命令行,因此您可以轻松地在grunt中创建几个任务,除了通过shell执行ant任务之外什么都不做。
grunt-shell
库使得从grunt任务执行外部命令变得特别容易:https://github.com/sindresorhus/grunt-shell
既然您正在讨论自定义退出代码,那么您可能必须最终编写自己的自定义grunt任务来执行shell命令,然后查看响应代码(可能使用grunt.helpers.spawn
帮助者):https://github.com/gruntjs/grunt/blob/master/docs/api_utils.md#gruntutilsspawn
我的建议?我的organization recently went through the same thing,如果可能的话,最好还是与ant彻底决定,并完全摆脱与JavaScript相关的项目。
Grunt拥有如此丰富且有用的插件库如果您无法复制ant构建文件并创建100%的JavaScript解决方案,我会感到惊讶。
答案 2 :(得分:0)
您可以使用http://abc.tools.qafoo.com/,其中包含npm模块* 1)
您唯一需要的是自定义目标,如:
…
<target
name="-mm:compile:main~hooked"
extensionOf="-compile:main~hook"
depends="
-my-compile-npm-hook
"
>
<target
name="-my-compile-npm-hook"
>
<echo>install local grunt-cli</echo>
<antcall target="npm:install">
<param name="in.npm.package.name" value="grunt-cli" />
</antcall>
</target>
…
之后你可能会在.npm/node_modules/.bin/
目录别名${npm.local.modulesdir}/.bin/
中运行grunt
^^不要错过包含或定义src/main/resources/extensions/npm/npm.properties
* 1):unfortunatly buggy与当前node.js版本