将咕噜与蚂蚁结合起来

时间:2012-08-27 18:24:33

标签: gruntjs

是否有任何关于将grunt与ant集成的好教程?我们当前的构建使用ant,因为我们是Java商店。然而,前端开始成为一流的公民,我们正在研究使用node和grunt进行前端构建。我需要将前端构建与ant构建集成。我需要知道如何规范化所有自定义任务的退出代码以及内置的grunt任务,并在ant调用grunt任务时将控制台输出限制为这些预定义代码。任何帮助将不胜感激。

3 个答案:

答案 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=" &gt; _tempfile.out 2&lt;&amp;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 &amp; del _tempfile.out &amp; exit /b 1)"/>

            <!-- Otherwise, just type the temporary file and delete it-->
            <arg line=" &amp; type _tempfile.out &amp; del _tempfile.out &amp;"/>
        </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版本