ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nx Gradle 插件版本迁移实战:将 dev.nx.gradle.project-graph 升级至 0.1.20

Nx Gradle 插件版本迁移实战:将 dev.nx.gradle.project-graph 升级至 0.1.20 Nx Gradle 插件版本迁移实战将 dev.nx.gradle.project-graph 升级至 0.1.20【免费下载链接】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 仓库中 change-plugin-version-0-1-20.md 为骨架讲解如何将 Gradle 构建中的dev.nx.gradle.project-graph插件从 0.1.19 升级到 0.1.20。你将掌握手动修改构建文件与通过nx migrate自动迁移两条路径并深入理解 Nx 迁移器在 build.gradle、build.gradle.kts 与 version cataloglibs.versions.toml三种声明场景下的底层更新原理。迁移背景Nx 与 Gradle 项目图的版本绑定Nx 通过nx/gradle插件将 Gradle 项目接入 Nx 的可计算项目图project graph而这一能力依赖一个独立的 Gradle 插件dev.nx.gradle.project-graph。该插件在 Gradle 构建期执行项目图探测生成一份 JSON 文件供 Nx 消费其产物结构包含nodes、dependencies与externalNodes三部分详见 project-graph/README.md。由于 Nx 主版本与 Gradle 插件版本之间存在兼容性绑定Nx 在每次插件迭代后都会通过**迁移migration**机制要求工作区同步升级插件版本。0.1.20正是 Nx 22.7.0 周期内的一次插件版本更新——在 migrations.json 中该迁移被注册在22.7.0-beta.16版本下change-plugin-version-0-1-20: { version: 22.7.0-beta.16, cli: nx, description: Change dev.nx.gradle.project-graph to version 0.1.20 in build file, factory: ./dist/src/migrations/22-7-0/change-plugin-version-0-1-20, documentation: ./dist/src/migrations/22-7-0/change-plugin-version-0-1-20.md }同一迁移批次22-7-0目录还包含 0.1.16 至 0.1.19 的连续版本升级可以看出这是 Nx 针对 Gradle 插件的高频小版本迭代节奏。手动升级修改构建文件中的插件版本原迁移文档给出的核心操作是在构建文件中将dev.nx.gradle.project-graph的版本改为 0.1.20。文档以 Groovy DSLbuild.gradle给出了修改前后的对照修改前Beforeplugins { id dev.nx.gradle.project-graph version 0.1.19 }修改后Afterplugins { id dev.nx.gradle.project-graph version 0.1.20 }如果你的工作区使用 Kotlin DSLbuild.gradle.kts则对应的写法是plugins { id(dev.nx.gradle.project-graph) version(0.1.20) }通过 version catalog 管理版本的情况在大型 Gradle 工作区中插件版本往往不直接写在plugins {}块里而是集中声明在gradle/libs.versions.toml再以 alias 方式引用。此时你需要修改的是 catalog 文件例如[plugins] nx-project-graph { id dev.nx.gradle.project-graph, version 0.1.20 }plugins { alias(libs.plugins.nx.project.graph) }注意catalog alias 中的短横线nx-project-graph在 Gradle accessor 中会转换为点号nx.project.graph这一规则在 gradle-project-graph-plugin-utils.ts 的aliasToAccessorPath函数中有明确实现。使用 nx migrate 自动升级手动修改虽然直观但 Nx 推荐通过官方迁移通道完成升级。迁移器已在nx/gradle包的 migrations.json 中注册并声明cli: nx因此当你将 Nx 升级到包含 22.7.0-beta.16 的版本后运行nx migrate nx/gradleNx 会解析迁移清单把change-plugin-version-0-1-20归入待执行的迁移集并在执行阶段调用对应的迁移工厂factory。执行迁移后构建文件中的插件版本会自动更新为 0.1.20无需手工编辑。迁移器底层实现解析自动迁移的核心逻辑位于 change-plugin-version-0-1-20.ts其执行流程分为四个步骤export default async function update(tree: Tree) { const nxJson readNxJson(tree); if (!nxJson) { return; } if (!hasGradlePlugin(tree)) { return; } const gradlePluginVersionToUpdate 0.1.20; // 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); }步骤一前置守卫迁移器首先读取工作区根目录的nx.json。若文件不存在或工作区并未启用nx/gradle插件迁移器会直接跳过。hasGradlePlugin的实现见 has-gradle-plugin.ts会检查nx.json中plugins数组是否包含nx/gradle——它同时兼容字符串形式nx/gradle与对象形式{ plugin: nx/gradle }的声明。这意味着只有真正使用 Gradle 支持的工作区才会被改动避免了对无关项目的无谓写入。步骤二先更新 version catalog迁移器优先处理gradle/libs.versions.toml这类版本目录文件由 updateNxPluginVersionInCatalogsAst 负责。它会通过globAsync查找所有**/gradle/*.versions.toml然后对每个 catalog 执行 AST 级别的版本替换。关键设计是基于 AST 的定点替换利用toml-eslint-parser解析 TOML 源码精确定位插件声明的 token 区间start/end仅替换版本字符串本身而不是整行重写。因此原有的注释、缩进、键顺序与引号风格单引号或双引号都能被完整保留。该工具同时支持两种 catalog 声明格式简单格式nx-project-graph dev.nx.gradle.project-graph:0.1.19直接改写为:0.1.20对象格式nx-project-graph { id dev.nx.gradle.project-graph, version 0.1.19 }改写内联表中的version字段version.ref 间接引用{ id dev.nx.gradle.project-graph, version.ref nxProjectGraph }时会顺着引用链去更新[versions]表中对应的版本条目。步骤三再更新 build.gradle(.kts)catalog 更新完成后迁移器调用 addNxProjectGraphPlugin 处理所有build.gradle(.kts)文件。其工作方式为通过 glob 找到工作区内所有settings.gradle与settings.gradle.kts并在其同目录确保存在对应的build.gradle或build.gradle.kts根据 DSL 类型选择声明语法——Kotlin DSL 生成id(dev.nx.gradle.project-graph) version(0.1.20)Groovy DSL 生成id dev.nx.gradle.project-graph version 0.1.20若插件已通过 catalog alias 引用则改用alias(libs.plugins.nx.project.graph)语法避免版本写死使用正则/id\s*\(?[]dev\.nx\.gradle\.project-graph[]\)?\s*version\s*\(?[]\)?/见 gradle-project-graph-plugin-utils.ts定位旧版本号并替换为 0.1.20若文件内容匹配不到则记录logger.warn提示手动更新不会破坏原文件确保插件在plugins {}块中声明并通过allprojects { apply ... }传播到所有子项目。迁移器还会调用extractNxPluginVersion校验当前版本若构建文件中无法解析出版本号它会回退到执行./gradlew buildEnvironment --quiet从依赖树输出中匹配dev.nx.gradle.project-graph:dev.nx.gradle.project-graph.gradle.plugin:version来确认实际生效版本见 gradle-project-graph-plugin-utils.ts。升级验证与插件功能回顾升级到 0.1.20 后可通过以下命令验证插件是否正确加载并生成项目图./gradlew nxProjectGraph正常执行会在终端输出类似 Task :nxProjectGraph your workspace /build/nx/add-nx-to-gradle.json该 JSON 文件即 Nx 项目图的数据来源。如需向 Gradle 探测过程传递额外参数可使用./gradlew nxProjectGraph -Phash12345此外该插件还提供nx {}DSL 用于在构建文件中声明项目级元数据name、tags与任务级配置如缓存开关以及nxProjectReport { atomized false }用于关闭任务级原子化目标生成详见 project-graph/README.md。这些能力与版本升级本身解耦可在升级后按需启用。版本演进一览0.1.20 在插件迭代中的位置从 packages/gradle/src/migrations 目录结构与 versions.ts 可以看出dev.nx.gradle.project-graph的版本随 Nx 版本持续演进插件版本对应 Nx 版本迁移注册位置0.1.16 ~ 0.1.1922.7.0-beta 系列22-7-0 目录0.1.2022.7.0-beta.16change-plugin-version-0-1-20.ts0.1.21 ~ 0.1.2223.0.023-0-0 目录0.1.23 ~ 0.1.2423.1.023-1-0 目录0.1.2523.2.023-2-0 目录值得注意的是仓库当前 versions.ts 中定义的默认插件版本已推进到0.1.25而 project-graph/build.gradle.kts 也以0.1.25发布该插件本身。这印证了0.1.20是 22.7.0 时代的历史迁移点只要工作区升级到包含该迁移的 Nx 版本无论之前停留在 0.1.19 还是更早版本都能通过同一迁移器平滑收敛到目标版本。小结dev.nx.gradle.project-graph从 0.1.19 升级到 0.1.20 是一条典型的 Nx 插件版本迁移路径手动场景下只需修改build.gradleGroovy或build.gradle.ktsKotlin中的插件版本号或同步更新gradle/libs.versions.toml自动场景下则通过nx migrate nx/gradle触发注册于 migrations.json 的迁移器。迁移器内部以先版本目录、后构建文件的顺序配合 AST 定点替换与正则版本匹配在保留原有格式的前提下完成升级并通过nx/gradle插件存在性守卫确保只作用于适用工作区。理解这条调用链不仅能让本次升级得心应手也能让你举一反三地掌握 Nx 迁移机制在 Gradle 生态中的通用运作方式。【免费下载链接】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),仅供参考
返回列表