如何配置nx release以适配包含Java和Node.js应用的NX Monorepo?
解决NX Monorepo中Java项目的Release配置问题
NX Release默认是为npm生态设计的,依赖package.json管理版本,而Java项目用pom.xml,所以需要调整配置来实现统一发布。以下是几种可行方案:
方案1:统一版本号,拆分发布执行逻辑
如果只想统一仓库版本号,同时分别处理前端和Java的发布流程:
- 修改
nx.json的release配置,仅包含前端项目,指定根目录package.json作为版本源:
{ "release": { "projects": ["apps/node/**"], "version": { "source": "root" } } }
- 执行NX Release更新版本号:
nx release patch --first-release
这会同步更新根目录和所有前端项目的package.json版本。
3. 同步Java项目版本:写一个简单脚本(Node.js/Shell均可),读取根package.json的version字段,批量替换所有Java项目pom.xml里的版本号。
4. 单独执行Java项目的Maven发布:
nx run-many -t deploy --projects=apps/java/**
方案2:给Java项目添加极简package.json适配NX Release
给每个Java项目添加仅用于版本管理的package.json,配合NX配置执行Java发布任务:
- 在每个Java项目根目录创建
package.json,内容如下:
{ "name": "my-java-service", "version": "1.0.0", "scripts": { "release": "mvn deploy" } }
- 修改
nx.json的release配置,指定Java项目的发布命令:
{ "release": { "projects": ["apps/**"], "projectsConfigurations": { "apps/java/**": { "packageRoot": ".", "releaseCommand": "npm run release" } } } }
- 可选:添加版本同步脚本,在发布前把
package.json的版本同步到pom.xml:
{ "scripts": { "prerelease": "node ./sync-version.js", "release": "mvn deploy" } }
sync-version.js示例:
const fs = require('fs'); const pkg = require('./package.json'); const pomContent = fs.readFileSync('./pom.xml', 'utf8') .replace(/<version>.*<\/version>/, `<version>${pkg.version}</version>`); fs.writeFileSync('./pom.xml', pomContent);
- 执行NX Release时,会自动更新所有项目版本号,并调用Java项目的
release命令完成Maven发布。
方案3:自定义NX Release生命周期钩子
利用NX Release的hooks,在版本更新后统一处理Java项目的发布:
- 修改
nx.json的release配置,添加postVersion钩子:
{ "release": { "projects": ["apps/node/**"], "version": { "source": "root" }, "hooks": { "postVersion": "node ./scripts/sync-java-versions.js && nx run-many -t deploy --projects=apps/java/**" } } }
- 编写
scripts/sync-java-versions.js脚本,实现根版本到Java项目pom.xml的同步(逻辑同方案1的脚本)。 - 执行NX Release时,会先完成前端版本更新,再自动执行钩子脚本同步Java版本并发布。
内容的提问来源于stack exchange,提问作者vikingsteve
相关产品推荐
相关产品推荐

