[英]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 应用程序,所以完美的场景是:
npm install
(即 - 从节点包注册表下载依赖项)我试图为 maven 找到一个 nodejs 包,但老实说 - 作为一个 node.js 开发人员,我在选择正确的工具时不是很自信,因为我无法区分坏的 maven 插件和一个体面的。
也许使用 shell 插件并从终端调用npm install
是更好的选择?
你怎么看?
你有两个选择:
https://github.com/eirslett/frontend-maven-plugin让 maven 从你的 package.json 下载你的 npm 模块,让它一直自动安装 node 和 npm
https://github.com/mulesoft/npm-maven-plugin让 maven 下载您在 pom.xml 中指定的 npm 包(链接截至 2020 年 4 月已失效,似乎已停止使用)
作为一个 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”的一部分自动运行。
就像 frontend-maven-plugin 一样,它会在 maven 项目中运行 npm 脚本。 有两个重要区别:
就我个人而言,我更喜欢 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.