只安装一次节点,而不是每次都使用 Maven 构建
Posted
技术标签:
【中文标题】只安装一次节点,而不是每次都使用 Maven 构建【英文标题】:Installing node once only and not each time with Maven build 【发布时间】:2016-10-30 05:15:01 【问题描述】:我需要一个帮助。
我正在使用 grunt 来编译 CSS/JS
我有一个问题,即每次构建都会创建我的节点包,并且它在 Jenkins 中占用了大量空间。我正在使用相同的 maven 前端插件。
我希望该节点包最初只创建一次,而不是在每个 maven 构建时再次创建。
<id>grunt</id>
<build>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>0.0.26</version>
<!-- optional -->
<configuration>
<workingDirectory>DIR
</workingDirectory>
<nodeVersion>v4.2.1</nodeVersion>
<npmVersion>3.5.1</npmVersion>
<installDirectory>node</installDirectory>
</configuration>
<executions>
<execution>
<id>node and npm install</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
<installDirectory>node</installDirectory>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
<installDirectory>node</installDirectory>
</configuration>
</execution>
<execution>
<id>grunt build</id>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我们正在使用 maven -P grunt 进行构建。它正在为每个 Maven 构建创建和安装节点。
为了在全球范围内拥有节点,我正在尝试 maven -P grunt -g ,但它不起作用。
在 GitHub 群里,我看到有人说我们不能用 maven frontend plugin 做,所以我尝试了 maven exec plugin。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>prepare-dist-npm-runtime-dependency</id>
<phase>prepare-package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>node/node</executable>
<workingDirectory>dist</workingDirectory>
<arguments>
<argument>../node/npm/cli.js</argument>
<argument>install</argument>
<argument>--production</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
但我无法看到它工作。谁能帮助如何运行 maven 以使其适用于全局节点安装而不是在每次构建时安装节点?
如果有任何其他建议只安装一次节点而不是全局安装将不胜感激。
【问题讨论】:
我认为因为你一直使用配置文件运行 maven build,它会在你构建的时候生成节点。我认为您应该配置您的 jenkins CI 仅在脚本发生某些更改时触发构建。默认情况下,jenkins 应该运行默认的 maven 构建,而不是通过配置文件运行。 【参考方案1】:您不能使用 Frontend maven plugin
全局安装 Node 或 NPM。如果我们看一下documentation,我们会发现该插件的全部目的是能够在隔离环境中安装 Node 和 NPM,仅用于构建,并且不会影响机器的其余部分。
Node/npm 只会在本地“安装”到您的项目中。它不会 在整个系统上全局安装(并且不会干扰 已经存在任何 Node/npm 安装。)
不打算取代 Node 的开发者版本 - 前端 开发人员仍将在他们的笔记本电脑上安装 Node,但后端 开发人员可以运行干净的构建,甚至无需在其上安装 Node 电脑。
不打算安装 Node 用于生产用途。节点用法是 旨在作为前端构建的一部分,运行常见的 javascript 任务 如缩小、混淆、压缩、打包、测试 等等
您可以尝试使用两种不同的配置文件运行插件,一种用于安装,另一种用于安装后的日常使用。在下面的示例中,您应该能够通过运行安装 Node 和 NPM:
mvn clean install -PinstallNode
然后每次构建之后:
mvn clean install -PnormalBuild
或者因为normalBuild
默认设置为激活,只是:
mvn clean install
注意安装目标不在日常配置文件中:
<profiles>
<profile>
<id>installNode</id>
<build>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>0.0.26</version>
<!-- optional -->
<configuration>
<workingDirectory>DIR</workingDirectory>
<nodeVersion>v4.2.1</nodeVersion>
<npmVersion>3.5.1</npmVersion>
<installDirectory>node</installDirectory>
</configuration>
<executions>
<execution>
<id>node and npm install</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
<installDirectory>node</installDirectory>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
<installDirectory>node</installDirectory>
</configuration>
</execution>
<execution>
<id>grunt build</id>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>normalBuild</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>0.0.26</version>
<!-- optional -->
<configuration>
<workingDirectory>DIR</workingDirectory>
<nodeVersion>v4.2.1</nodeVersion>
<npmVersion>3.5.1</npmVersion>
<installDirectory>node</installDirectory>
</configuration>
<executions>
<execution>
<id>grunt build</id>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
【讨论】:
例如,在一个项目中,我有 3 个主要配置文件:一个执行完整构建,其中获取所有 NPM 和 Bower 依赖项,构建我们的客户端 AMD 和 SASS,并构建 jar;另一个只是构建客户端资产和 jar 而不获取依赖项;而 final 只构建 Java 包。这样,在日常 Java 开发中,我就不需要不断地运行 Bower 或 Grunt。当我更新 JS 或 CSS 时,我可以运行将运行 Bower 和 Grunt 的配置文件。只有当我需要引入依赖项时,我才能运行完整的构建,否则不会减慢自己的速度。 感谢您的回答正是我想要解决的具体问题。以上是关于只安装一次节点,而不是每次都使用 Maven 构建的主要内容,如果未能解决你的问题,请参考以下文章
在使用 github 操作进行构建期间执行诗歌安装时,使用预编译的 numpy 包而不是构建它
你如何强制一个 maven MOJO 在构建结束时只执行一次?