52

我们团队的大部分成员都是 java 开发人员,因此整个构建/部署/依赖管理系统都建立在 maven 之上。我们使用 CI,因此每个构建过程都运行单元测试(前端使用 karma 和 phantomJS,后端使用 jasmine-node)。为此,我设法配置了一个 karma maven 插件。

这并不能解决在构建时从 package.json 下载 node.js 依赖项的问题。我需要在现有环境中部署我的 node.js / express 应用程序,所以完美的场景是:

  1. 从 repo 中提取(使用 maven build 自动完成)
  2. npm install(即 - 从节点包注册表下载依赖项)
  3. 运行测试

我试图为 maven 找到一个 nodejs 包,但老实说 - 作为一个 node.js 开发人员,我在选择正确的工具时并没有信心,因为我无法区分坏的 maven 插件和一个体面的。

也许使用 shell 插件并npm install从终端调用是更好的选择?

你怎么看?

4

4 回答 4

31

你有两个选择:

作为一个 hacky 解决方案,尽管您仍然可以使用 maven-antrun-plugin 之类的东西来实际使用 maven 执行 npm。

所有方法都有其优点和缺点,但 frontend-maven-plugin 似乎是最常用的方法 - 但它假设您的 ci 服务器可以从互联网上下载任意包,而“hacky”解决方案也应该有效,当您ci服务器根本没有连接到互联网(除了代理中央maven repo)

于 2015-03-26T19:25:30.240 回答
16

Grunt我认为您可以在许多可用的插件中找到答案。

我实际上正在开发一个 Web 项目,其中客户端是用AngularJS. 不过,我认为部署过程可能会部分回答您的问题:

在您的pom.xml中,您可以执行以下操作:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>exec-gen-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <target name="Build Web">

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c npm install" />
                    </exec>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c bower install --no-color" />
                    </exec>

                    <exec executable="cmd" dir="${project.basedir}"
                        failonerror="true" osfamily="windows">
                        <arg line="/c grunt release --no-color --force" />
                    </exec>

                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • 第一部分是npm install任务:从节点包下载依赖项。

  • 第二部分是bower install任务:使用 bower 下载其他依赖项(在我的情况下AngularJS,,但您可能不需要这部分)

  • 第三部分是Grunt Release部分:启动一个Grunt包含Karma单元测试的任务。

Grunt 您可以在此处找到有关文档。有许多可用的插件,例如Karma单元测试。

我希望这对你有所帮助。

于 2013-06-14T08:40:53.403 回答
13

我通过exec-maven-plugin使 npm 进程为我的AngularJS 2 + Spring Boot应用程序工作。我不使用 bower 和 grunt,但认为你也可以通过 exec-maven-plugin 使其工作,在查看上面来自 Pear 的 antrun 示例之后。

下面是我的 exec-maven-plugin 的 pom.xml 示例。我的应用程序有 package.json 并且所有 AngularJS .ts 文件都在 src/main/resources 下,所以从路径运行 npm。我为依赖项运行npm install并为 .ts 转换为 .js运行 npm run tsc

pom.xml

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-npm-run-tsc</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>run</argument>
                            <argument>tsc</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

对此的一个小技巧是使用 Windows 或 Mac 在 eclipse 上运行 maven build。它在 Eclipse 和 linux 上非常好,甚至在 Windows 命令窗口上也很好。在 Windows 上运行 eclipse 构建时,它无法理解npm并抱怨找不到文件。奇怪的是npm在 Windows 命令窗口上运行良好。所以解决黑客我在系统路径下创建npm.bat文件。在我的例子中,nodejs 和 npm 安装在 C:\Program File\nodejs 下。放置此批处理文件后。一切正常。

npm.bat

@echo off
set arg1=%1
set arg2=%2
C:\Progra~1\nodejs\npm.cmd %arg1% %arg2%

对于 Mac,我在 eclipse 上遇到了同样的问题。问题是 nodejs 和 npm 安装在 /usr/local/bin 下。所以为了解决这个问题,我在 /user/bin 下创建了符号链接 /usr/local/bin/node 和 /usr/local/bin/npm。但是 /usr/bin 在安全策略中受到保护,我是在从恢复磁盘启动后完成的

于 2016-05-23T18:14:08.457 回答
4

自 2015 年以来,Christian Ulbrich 的出色回答中提到了 frontend-maven-plugin 的替代方案:

https://github.com/aseovic/npm-maven-plugin

用法

基本上,使用它所需要做的就是像往常一样将它放入您的 POM 中(并使用“extensions:true”):

<build>
  <plugins>
    <plugin>
      <groupId>com.seovic.maven.plugins</groupId>
      <artifactId>npm-maven-plugin</artifactId>
      <version>1.0.4</version>
      <extensions>true</extensions>
    </plugin>
  [...]
  </plugins>
</build>

然后插件将自动绑定到 Maven 生命周期。然后,您可以将脚本放入您的 package.json 中,例如:

"scripts": 
  {
    "package": "npm pack",
  [...]
  }

并且 npm 脚本“包”将作为 Maven 构建生命周期阶段“包”的一部分自动运行。

与前端 Maven 插件相比

就像 frontend-maven-plugin 一样,它将在 maven 项目中运行 npm 脚本。有两个重要的区别:

  • frontend-maven-plugin 将(并且必须)下载并安装 npm 本身。npm-maven-plugin 使用(并且需要)已安装的 npm 版本。
  • frontend-maven-plugin 要求您在 POM 中描述每个 npm 调用(作为“执行”部分)。相比之下,npm-maven-plugin 只是扩展了Maven 构建生命周期,以自动为每个生命周期阶段(清理、安装等)执行具有相同名称的 npm 脚本。这意味着POM 中没有特定于 npm 的配置——它全部取自 package.json。

就个人而言,我更喜欢 npm-maven-plugin 的方法,因为它需要在 POM 中进行较少的配置- POM 有变得臃肿的趋势,并且所有可以解决的问题都有帮助。此外,将npm 调用放入 package.json感觉更自然,并允许在直接调用 npm 时重用它们。

诚然,即使使用 frontend-maven-plugin,您也可以 [并且可能应该] 将所有 npm 调用定义为 package.json 中的脚本,并从 POM 调用这些脚本,但仍然存在将它们直接放入 POM 的诱惑。

于 2020-04-16T19:37:09.657 回答