繁体   English   中英

如何使用 maven 部署 node.js 应用程序?

[英]How to deploy a node.js app with maven?

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

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

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

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

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

你怎么看?

你有两个选择:

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

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

我想你可以在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部分:启动包含Karma单元测试的Grunt任务。

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

我希望这对你有帮助。

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

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

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 上运行 build 时,它无法理解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 下。 所以为了解决这个问题,我将符号链接 /usr/local/bin/node 和 /usr/local/bin/npm 连接到 /user/bin 下。 但是 /usr/bin 在安全策略中受到保护,我是在从恢复磁盘启动后完成的

自 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 脚本“package”将作为 Maven 构建生命周期阶段“package”的一部分自动运行。

与前端 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 的诱惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM