如何实现特定目录不存在时才条件执行Maven插件
问题解答
完全可以实现仅当指定目录不存在时条件触发Maven插件执行,针对你需要避免npm ci不必要执行的需求,提供两种可直接落地的实现方案:
方案一:基于Maven原生Profile的条件激活(无额外插件依赖)
利用Maven Profile内置的文件存在性判断规则,仅当目标目录不存在时,才激活绑定了npm ci执行逻辑的配置块,判断时机为Maven项目初始化阶段。
你只需要把原有exec-maven-plugin的配置迁移到对应profile中即可,完整配置如下:
<profiles> <profile> <id>npm-ci-on-demand</id> <!-- 激活规则:当前项目根目录下node_modules目录不存在时自动激活 --> <activation> <file> <missing>${project.basedir}/node_modules</missing> </file> </activation> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>npm-install</id> <phase>prepare-package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>npm</executable> <arguments> <argument>ci</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
该方案的局限是判断仅在Maven启动时执行一次,如果构建流程中存在动态生成/删除node_modules的步骤,不会重新触发判断。
方案二:构建阶段动态判断(支持执行期实时校验)
如果需要在执行到prepare-package阶段时再实时判断目录状态,可以搭配maven-antrun-plugin先做目录检测,通过设置exec插件原生支持的exec.skip参数控制是否执行npm命令,配置如下:
<build> <plugins> <!-- 先执行目录检测,设置跳过标记 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>check-node-modules</id> <phase>prepare-package</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <available file="${project.basedir}/node_modules" type="dir" property="nodeModulesExist"/> <condition property="exec.skip" value="true" else="false"> <isset property="nodeModulesExist"/> </condition> </target> </configuration> </execution> </executions> </plugin> <!-- 原有exec插件配置无需修改,会自动读取exec.skip参数决定是否执行 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>npm-install</id> <phase>prepare-package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>npm</executable> <arguments> <argument>ci</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build>
补充说明
- 如果你的
node_modules目录不在项目根路径,直接替换配置中${project.basedir}/node_modules为实际的目录绝对路径即可 - 当你更新
package.json中的依赖后,手动删除node_modules目录再执行构建,就会自动重新执行npm ci安装最新依赖 - 不建议通过判断
package.json/package-lock.json的修改时间触发执行,团队协作场景下不同设备的文件时间戳容易不一致,会导致不必要的重复安装
内容的提问来源于stack exchange,提问作者gperiotto
相关产品推荐
相关产品推荐

