用ant执行npm

时间:2016-12-07 07:54:27

标签: maven ant npm

我想使用前端和后端自动构建应用程序。为此,我想使用maven和ant进行平台无关的复制和cli任务。有些像docker ...这样的cli就行了。但这不适用于npmnpm本身提供的cli。

<exec executable="docker">
    <arg line="version"/>
</exec>
<!--Works-->
<exec executable="C:\Program Files\nodejs\npm.cmd">
    <arg line="version"/>
</exec>
<!--Doesn't work-->
<exec executable="npm">
    <arg line="version"/>
</exec>

如第二个示例所示,如果我指定npm.cmd的完整路径,则脚本可以正常工作。但这至少应该在windows和unix上运行。因此,指定完整路径不是一种选择。

有没有办法从ant运行npm及其模块?

延迟编辑:

真正的问题是,Windows节点安装程序还将一个名为npm的文件放入bin文件夹,这是一个用于cygwin的bash脚本。 npm bin文件夹已添加到'global'PATH env var中,windows cmd确实选择了正确的二进制文件,因为它使用PATHEXT env var来确定可执行文件和不可执行文件。 ant exec插件不使用PATHEXT,只执行失败的第一个名为npm的文件。 解决方案是重命名路径中的普通npm文件。这样,ant首先看到npm.cmd文件,一切运行顺利。

4 个答案:

答案 0 :(得分:1)

如果你想使用npm,你应该看一下frontend-maven-plugin

答案 1 :(得分:1)

从我可以收集到的内容来看,不可能通过antrun插件直接调用npm。

我确实设法通过使用/ c参数调用cmd(在Windows上)来运行它。

示例:

<exec executable="cmd">
    <arg line="/c npm run babel -- src/main/webapp/js/es6/ --presets babel-preset-es2015 --out-dir src/main/webapp/js/"/>
</exec>

答案 2 :(得分:0)

这在Windows上对我有效:

<exec executable="npm.cmd">
    <arg value="version"/>
</exec>

答案 3 :(得分:0)

我知道这很旧,但这是我将来为他人所拥有的。可在我们的Mac,Unix和Windows框中使用。

  <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" />
    <attribute name="dir" description="Directory to execute task" />
    <element name="args" implicit="yes" description="Argument to pass to the exec task" />
    <sequential>
      <exec executable="cmd.exe" dir="@{dir}" failonerror="@{failonerror}" osfamily="winnt">
        <arg line="/c  @{module}" />
        <args />
      </exec>
      <exec executable="@{module}" dir="@{dir}" failonerror="@{failonerror}" osfamily="unix" logError="true">
        <args />
      </exec>
    </sequential>
  </macrodef>

那样的事情就可以了

    <exec-node dir="${node.project.dir}" module="npm" failonerror="true" >
      <arg value="run" />
      <arg value="lint" />
    </exec-node>

您当然可以将模块硬编码为npm或将其默认设置,但是我将其与npm和npx一起使用。