news 2026/9/11 18:56:04

Nx 23.1.0 Gradle 迁移指南:将 dev.nx.gradle.project-graph 升级到 0.1.23

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nx 23.1.0 Gradle 迁移指南:将 dev.nx.gradle.project-graph 升级到 0.1.23

Nx 23.1.0 Gradle 迁移指南:将 dev.nx.gradle.project-graph 升级到 0.1.23

【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx

本指南基于 Nx 仓库@nx/gradle包中内置的自动迁移器,讲解如何将 Gradle 构建文件中的dev.nx.gradle.project-graph插件从 0.1.22 升级到 0.1.23。读完本文,你将了解这条迁移在nx migrate流程中如何被触发、它修改了哪些文件、底层正则与 AST 解析的实现原理,以及当构建脚本使用版本目录(Version Catalog)时迁移器如何保持格式不变地完成替换。

迁移背景:版本升级为什么需要自动迁移

dev.nx.gradle.project-graph是 Nx 官方发布的 Gradle 插件,用于在 Nx 的项目图中集成 Gradle 工程。随着插件持续迭代(本仓库内从 0.1.0 一路升级到 0.1.25),Nx 会在每个版本中附带一个对应的迁移器,保证用户工作区中的插件版本始终与当前 Nx 版本兼容。

本次迁移对应 Nx 23.1.0 版本。在 packages/gradle/migrations.json 中可以看到它的注册信息:

"change-plugin-version-0-1-23": { "version": "23.1.0-beta.4", "cli": "nx", "description": "Change dev.nx.gradle.project-graph to version 0.1.23 in build file", "factory": "./dist/src/migrations/23-1-0/change-plugin-version-0-1-23", "documentation": "./dist/src/migrations/23-1-0/change-plugin-version-0-1-23.md" }

它属于cli: "nx"类型的迁移,意味着执行nx migrate时会被自动应用,无需手动干预。

自动迁移:如何执行与触发条件

在启用了@nx/gradle插件的工作区中,升级到 Nx 23.1.0 并运行:

nx migrate @nx/gradle@23.1.0 nx migrate --run-migrations

迁移器会自动扫描并更新所有 Gradle 构建文件。但需要注意,它的执行是有前置条件的。从迁移实现 change-plugin-version-0-1-23.ts 可以看到,迁移器会先做两次"短路判断":

  1. 工作区必须存在nx.jsonreadNxJson(tree)返回空时直接返回,不做任何修改;
  2. 工作区必须启用了@nx/gradle插件:通过 has-gradle-plugin.ts 检查nx.jsonplugins数组中是否包含字符串形式的"@nx/gradle"或对象形式的{ plugin: "@nx/gradle" }

只有当这两项都满足时,才真正开始版本更新:

const gradlePluginVersionToUpdate = '0.1.23'; // Update version in version catalogs using AST-based approach to preserve formatting await updateNxPluginVersionInCatalogsAst(tree, gradlePluginVersionToUpdate); // Then update in build.gradle(.kts) files await addNxProjectGraphPlugin(tree, gradlePluginVersionToUpdate);

更新分两步执行:先更新版本目录(libs.versions.toml),再更新 build.gradle(.kts) 文件,顺序上保证版本目录中的version.ref被正确指向新版本后,构建文件中的引用不会产生不一致。

手动修改:Before / After 对照

如果你选择不运行自动迁移,也可以手动修改构建文件。迁移文档给出的示例针对 Groovy DSL:

Before(升级前)— build.gradle:

plugins { id "dev.nx.gradle.project-graph" version "0.1.22" }

After(升级后)

plugins { id "dev.nx.gradle.project-graph" version "0.1.23" }

底层实现:build.gradle(.kts) 是如何被改写的

对于 Groovy 与 Kotlin DSL 两种构建脚本,迁移器复用了 gradle-project-graph-plugin-utils.ts 中的逻辑。核心机制是一个正则表达式:

const regex = /(id\s*\(?["']dev\.nx\.gradle\.project-graph["']\)?\s*version\s*\(?["'])([^"']+)(["']\)?)/;

该正则同时兼容两种 DSL 写法:

  • Groovy:id "dev.nx.gradle.project-graph" version "0.1.22"
  • Kotlin:id("dev.nx.gradle.project-graph") version("0.1.22")

匹配后通过updateNxPluginVersioncontent.replace(regex,$1${newVersion}$3)精确替换版本号,保持插件声明前后语法不变。若构建文件中找不到匹配,会输出一条日志提示手动更新:

Please update plugin dev.nx.gradle.project-graph to 0.1.23

迁移的目标文件通过addBuildGradleFileNextToSettingsGradle定位:它使用 glob 匹配**/settings.gradle**/settings.gradle.kts,并在每个 settings 文件同目录下寻找对应的build.gradlebuild.gradle.kts。这意味着多模块工作区中所有 Gradle 工程都会同步更新

从测试用例 change-plugin-version-0-1-12.spec.ts(同一系列迁移的验证样板)可以确认以下行为:

  • Groovy DSL 与 Kotlin DSL 的插件声明都能被正确改写;
  • 存在多个build.gradle文件时全部更新;
  • 缺少nx.json时不做任何修改;
  • 未启用@nx/gradle插件时不修改构建文件。

版本目录(Version Catalog):三种格式的 AST 级更新

如果项目使用 Gradle Version Catalog(gradle/libs.versions.toml)管理插件版本,迁移器会先通过 version-catalog-ast-utils.ts 处理。它使用toml-eslint-parser将 TOML 解析为 AST,再基于 AST 节点的range做定点替换,从而完整保留原始格式(包括注释、缩进与引号风格)。

findVersionCatalogFiles通过 glob 搜索**/gradle/*.versions.toml找出所有目录文件。对于目录中声明的dev.nx.gradle.project-graph插件,支持三种书写格式:

格式一:简单格式(simple)

[plugins] nx-graph = "dev.nx.gradle.project-graph:0.1.22"

迁移后:nx-graph = "dev.nx.gradle.project-graph:0.1.23",并保持单双引号风格不变。

格式二:内联表 + 直接版本(object with version)

[plugins] nx-graph = { id = "dev.nx.gradle.project-graph", version = "0.1.22" }

迁移后:version = "0.1.23"

格式三:内联表 + 版本引用(object with version.ref)

[versions] nx-project-graph = "0.1.22" [plugins] nx-graph = { id = "dev.nx.gradle.project-graph", version.ref = "nx-project-graph" }

此时迁移器不会改动[plugins]段,而是顺着version.ref找到[versions]表中对应的版本键,把nx-project-graph = "0.1.22"更新为"0.1.23",确保引用关系始终有效。

目录文件的搜索顺序(见findVersionCatalogPluginAlias):先查构建文件同级的gradle/libs.versions.toml,再查工作区根的gradle/libs.versions.toml,最后递归搜索构建文件子目录下的所有libs.versions.toml。若插件通过目录别名声明,addNxProjectGraphPluginToBuildGradle还会把构建文件中的声明改写为alias(libs.plugins.xxx)形式(别名中的短横线会转换为点号访问器,如nx-project-graphlibs.plugins.nx.project.graph),实现单点管理版本。

迁移后的验证与常见问题

升级完成后,可以按以下方式确认迁移生效:

# 在构建文件所在目录执行,查看插件实际解析版本 ./gradlew buildEnvironment --quiet | grep project-graph

该命令与迁移器内部的兜底逻辑一致:当build.gradle中无法通过正则匹配到版本时,迁移器会执行buildEnvironment --quiet并从依赖树中解析dev.nx.gradle.project-graph:dev.nx.gradle.project-graph.gradle.plugin:<version>的实际版本(见extractNxPluginVersion/getPluginVersion)。

常见注意事项:

  • Kotlin DSL 无需特殊处理build.gradle.kts中的id("...") version("...")写法同样被正则覆盖;
  • 多工程工作区:所有存在settings.gradle(.kts)的目录都会参与更新,可对照测试中的多文件场景验证;
  • 版本目录与直接声明共存:迁移会同时处理目录与构建文件,两者最终版本保持一致;
  • 提前退出:没有nx.json或未启用@nx/gradle插件的工作区,迁移器直接返回,构建文件不会被误改。

小结

dev.nx.gradle.project-graph0.1.22 → 0.1.23 的升级迁移是 Nx 23.1.0 自动迁移体系中的一个典型示例:先校验工作区与插件启用状态,再通过正则精确改写 Groovy/Kotlin DSL 构建文件,并通过 TOML AST 定点替换优雅处理三种版本目录格式。理解这一迁移的实现(change-plugin-version-0-1-23.ts)与其复用工具(gradle-project-graph-plugin-utils.ts、version-catalog-ast-utils.ts),不仅能帮助你顺利升级,也能让你在后续遇到 0.1.24、0.1.25 等同类迁移时举一反三。

【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 18:55:41

SSM宿舍管理系统:动态SQL、事务控制与状态机实战

简介&#xff1a;这是一套面向计算机专业本科生的Java毕业设计实战项目&#xff0c;基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的B/S架构大学生宿舍管理系统&#xff0c;解决高校宿舍管理中信息分散、流程低效、多角色协同难等实际问题。资源包共1067个文…

作者头像 李华
网站建设 2026/9/11 18:54:02

基于Spring Boot的家政服务管理平台:从数据建模到订单状态机完整实现

简介&#xff1a;一套基于Spring Boot的家政服务管理平台毕业设计项目源码包&#xff0c;面向Java方向毕业生和课程设计学生&#xff0c;也适合正在学习Spring Boot的开发者参考。系统同时包含前台操作与后台管理两条业务线&#xff1a;用户端覆盖首页、服务信息、公告信息、留…

作者头像 李华
网站建设 2026/9/11 18:53:13

Dota 2玩家熟练度二分类实战 从对局统计到AUC建模方案

这道 Kaggle 案例聚焦于一个很有代表性的行为识别问题&#xff1a;依据单场 Dota 2 对局统计&#xff0c;判断玩家是否属于熟练玩家。场景来自电竞&#xff0c;但建模本质并不是游戏研究&#xff0c;而是从高噪声、强随机性的行为数据中提取稳定的能力信号。 文章内容围绕结构…

作者头像 李华
网站建设 2026/9/11 18:51:44

北京GEO优化公司怎么选:预算、服务商与风险核验

随着生成式AI搜索持续渗透&#xff0c;GEO已经成为北京企业构建品牌认知和获取精准流量的重要工作。北京服务商数量多、路线差异大&#xff0c;中小微企业常见问题是看不懂技术、容易被低价吸引、又担心大牌方案溢价过高。高性价比的判断&#xff0c;应回到投入产出&#xff0c…

作者头像 李华
网站建设 2026/9/11 18:51:08

YOLO车辆检测数据集清洗与三类别训练实战指南

简介&#xff1a;本资源是面向计算机视觉初学者与YOLO模型实践者的车辆检测专用数据集&#xff0c;专为训练多类别目标检测模型设计&#xff0c;适用于自动驾驶感知模块开发、智能交通监控系统搭建等实际场景。数据集共5380个文件&#xff0c;包含1793张高质量JPG车辆图像&…

作者头像 李华