尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flutter鸿蒙化工程代码提交风控:lint-staged与husky适配实践

Flutter鸿蒙化工程代码提交风控:lint-staged与husky适配实践 上周帮一个团队处理 Flutter 工程往鸿蒙迁移的事工程本身跑起来问题不大真正让我头疼的是交付质量断崖式下跌。开发同学在 DevEco Studio 里改完 ArkTS顺手就用 IDE 的格式化Flutter 侧代码却是另一套风格有人绕过了 git hook 直接 pushCI 第一时间就红了更麻烦的是 lint 规则完全对不上号——Flutter 的 dart analyze 根本看不懂 entry/src/main/ets 下的文件原来的 husky lint-staged 组合在鸿蒙工程里基本等于废了。这件事让我重新审视了「代码提交风控体系」这个概念。鸿蒙化之后的 Flutter 工程同时存在 Dart、ArkTS、JSON5 和 ohpm 依赖等多套代码生态单靠 IDE 的保存时格式化远远不够必须在 git 提交这个环节做一次统一口径的强制校验。这就是本次 lint_staged 鸿蒙化适配的核心价值。我把适配过程完整写出来先讲清楚它为什么会失效再给出可以直接照抄的配置模板最后把我踩过的坑和进阶优化方案一并交代。如果你正在做 Flutter 鸿蒙化或者准备在团队里落地一套自动化的提交质量拦截机制这篇文章应该能帮你省不少试错时间。1. 为什么鸿蒙上需要一套独立的代码提交风控体系1.1 鸿蒙化 Flutter 工程里的“多头并进”现状鸿蒙化之后的 Flutter 工程和传统单栈项目最大的区别在于一个仓库里同时跑着两套技术栈。典型目录是这样的project-root/ ├── entry/src/main/ets/ # 鸿蒙侧 ArkTS 页面、Ability、业务逻辑 ├── lib/ # Flutter 侧 Dart 业务代码 ├── build/ # 构建产物 ├── oh-package.json5 # 鸿蒙侧 ohpm 依赖 ├── pubspec.yaml # Flutter 侧依赖 └── .git/这个结构带来三个现实问题代码风格不统一dart format 和 DevEco 里的格式化器完全是两套审美依赖管理分裂pubspec 管不到 oh_modules工具链互不可见Flutter 的命令行工具不知道 ArkTS 文件存在。如果没有一道强制闸门代码会在合并时越来越乱。我见过最典型的场景Flutter 侧代码规规矩矩打开 entry 目录却像另一个人的作品缩进、引号、命名全不一致。团队不是不想管是“管不过来”——两个技术栈的 lint 工具根本没有统一入口。1.2 lint-staged 在传统 Flutter 工程里管的是哪几道关卡在纯 Flutter 工程里lint-staged 配合 husky 是很多团队的标准配置。lint-staged 本身不检查代码它像一个调度员读取 git 暂存区里的文件列表按 glob 规则分类再把每一类文件路由给对应的 linter 或 formatter。常见的分工是这样dart format统一代码风格失败说明格式不达标flutter analyze --fatal-infos静态分析发现潜在 bug 和违规引用commitlint校验提交信息是否符合 conventional commits 规范它和 CI 检查最大的区别是只处理“本次提交要带走的文件”不做全仓扫描所以速度快。你改了 3 个文件它不检查另外 2000 个。这个设计很聪明既保证了每次提交的代码确实过了检查又不会因为全量扫描拖慢开发节奏。但鸿蒙化之后这个调度逻辑出了问题*.dart规则照常生效但*.ets文件没有任何规则去接直接裸奔。更糟的是如果有人在配置里用flutter analyze全量扫它看到 entry 目录下的 ts/ets 文件还会直接懵掉。1.3 鸿蒙化之后工程链路发生的变化鸿蒙侧并不缺代码检查能力DevEco Studio 自带 Code Linter能检查 ArkTS 的语法、规范、甚至 API 兼容性问题。问题是它主要在 IDE 里跑命令行封装在不同版本里很不统一没法像dart format那样在 git hook 里一条命令调起来。而 Flutter 的静态分析工具链又是冲着 Dart 生态设计的。flutter analyze会检查 pubspec 声明的依赖、lib 目录下的 import 路径它天然不能理解 oh-package.json5 的依赖关系。两边工具链互不咬合正是鸿蒙化工程里“提交风控失守”的根源。所以要适配 lint-staged核心不是改 lint-staged 本身而是要在它后面接一个“路由层”让*.dart走 Dart 工具链让*.ets走鸿蒙工具链或兜底脚本让两边在同一个 pre-commit 里被统一调度。2. 拆解 lint-staged 的工作链路一次 commit 到底被谁拦截2.1 git pre-commit 阶段发生了哪些事想适配一个工具要先把它运行的链路吃透。lint-staged 在 git 提交时做的事比我之前以为的要清晰得多开发者执行git add文件进入暂存区git commit触发.husky/pre-commit脚本脚本执行npx lint-stagedlint-staged 通过git diff --cached --name-only --diff-filterACMR拿到本次暂存的文件清单按配置里的 glob 规则把文件分组每组交给对应的命令执行全部通过commit 继续任何一个命令非零退出commit 中止这里有个容易被忽略的细节--diff-filterACMR表示只处理 Added、Copied、Modified、Renamed 的文件已删除的文件不会因为“残留了 lint 问题”被再次拦截。这个设计是对的避免了你删一个坏文件还被 lint 卡住的尴尬。另一个关键是命令退出码。lint-staged 并不自己判断“代码是否合格”它只是负责把文件喂给工具、收集工具返回的退出码。返回 0 就放行返回非 0 就拦截。所以你说“lint-staged 不管代码质量”也没错它管的是流程真正做质量判断的是后面的工具。2.2 glob 规则只对“暂存文件”生效很多第一次用 lint-staged 的人会把它当成“全量格式化工具”这是一个误解。它的匹配对象严格限定在暂存文件上。比如配置{ *.dart: [dart format --line-length 120 --set-exit-if-changed] }如果你改了lib/main.dart并git add这个规则会触发如果你改了lib/main.dart但没 add规则不会触发。反过来就算你git add了某个第三方生成的.g.dart文件只要它匹配*.dart规则照跑。这个“只对暂存文件生效”的特性在鸿蒙工程里有两个实践价值。第一它天然适配“两个技术栈并存”的结构你只要把规则写够改了哪边的代码就触发哪边的检查。第二它能避开大仓库性能问题——不做全量扫描一次只处理几十个文件快则几秒慢则十几秒开发体验完全在接受范围内。我见过有人把.lintstagedrc里的 glob 写得过于宽泛比如**/*.dart结果构建产物目录里的临时 dart 文件也被拿去 format。正确做法是精确匹配源码目录必要时用否定 pattern 排除生成目录{ *.dart: [dart format --line-length 120 --set-exit-if-changed], !**/build/**: [], !**/oh_modules/**: [] }2.3 Flutter 侧和鸿蒙侧的 lint 工具根本不在一个体系里这一步拆解是把适配方案设计正确的前提。两套工具栈的关系是“各管一摊互不认识”维度Flutter 侧鸿蒙侧代码语言DartArkTSTS 子集格式化工具dart formatDevEco 内置格式化器静态检查flutter analyze / dart analyzeDevEco Code Linter依赖声明pubspec.yamloh-package.json5构建工具flutter buildhvigorw / ohpm命令行能力成熟稳定Linter 命令行封装不一这个对比说明适配 lint-staged 最忌讳的事是“一把抓”——想用同一个命令同时检查 Dart 和 ArkTS这根本不现实。正确的思路是分层格式层Dart 用 dart formatArkTS 用自定义脚本做语法级校验静态分析层Flutter 侧用 flutter analyze鸿蒙侧交给 CI 编译阶段兜底提交信息层用 commitlint两边共用本地 hook 要优先保证“快”和“稳”所以只拦截低级错误和格式问题。完整的鸿蒙侧 Linter、全量编译检查放到 CI这才是合理的架构。后面第 4 节我会专门讲为什么不能把 flutter analyze 全量塞进 lint-staged。3. 鸿蒙化适配的具体落地步骤从 npm 初始化到 hook 生效3.1 环境准备Node、ohpm 和 husky 的依赖关系先说清楚一件事lint-staged 和 husky 都是 Node 生态的工具它们对鸿蒙侧代码一无所知但它们是整个风控体系的“调度中枢”。所以第一步得先在鸿蒙化工程的根目录初始化一个 npm 项目用来承载这套工具链。假设你已经有了一个能正常构建的鸿蒙 Flutter 工程接下来cd project-root npm init -y npm install husky lint-staged commitlint/cli commitlint/config-conventional typescript prettier eslint --save-dev npm pkg set scripts.preparehusky npx husky initscripts.prepare的作用是当有人执行npm install时自动触发 husky 的安装脚本把 git hooks 绑定到.husky/目录。这样新同学拉完仓库、装完依赖本地工具链自动就位不需要手动配置。执行完npx husky init项目会多出一个.husky/pre-commit文件默认内容通常是npm test。我们要把它改成执行 lint-staged。这一步先别急后面模板章节会给完整配置。一个需要提醒的坑如果你是在 DevEco Studio 自带的终端里执行命令Node 路径可能指向 DevEco 内置的 node。husky 在安装 hooks 时会记录PATH如果这个内置 Node 的路径和 CI 里不一致后续可能出现“本地 hook 能跑CI 里跑不了”的诡异问题。我的建议是统一用系统安装的 Node LTS 版本并确保node -v在终端和 IDE 里输出一致。3.2 .lintstagedrc 配置的核心路由逻辑适配的核心就在.lintstagedrc里。我给出的配置是两个技术栈的分水岭{ *.dart: [dart format --line-length 120 --set-exit-if-changed], *.ets: [node scripts/check-arkts-lint.js], *.{ts,tsx}: [eslint --max-warnings 0], *.{json,json5,yml,yaml,md}: [prettier --write], *.{kt,java}: [ktlint --format] }逐条解释一下*.dart走 dart format 严格检查。--set-exit-if-changed是关键参数如果文件需要被格式化dart format 会返回非 0commit 被拦截。这样保证所有提交的 Dart 代码都符合统一格式。*.ets走自定义脚本。为什么不用 DevEco 的命令行 Linter因为它的调用方式在不同版本里不稳定而且完整 lint 很重。自己写一个轻量脚本只做语法级校验和基础问题拦截本地体验会好很多。脚本内容第 5 节给出。*.{ts,tsx}走 eslint。这是给鸿蒙工程里可能存在的非 ets 的 ts 文件准备的你也可以不放看项目里有没有这类文件。*.{json,json5}走 prettier。这里要特别说一句鸿蒙工程里的oh-package.json5和build-profile.json5格式规范比较特殊prettier 默认会把它按 JSON5 处理效果还行但如果团队习惯 DevEco 的自动格式化也可以在 prettier 规则里单独排除。*.{kt,java}走 ktlint。如果你的鸿蒙工程还保留 Android 原生模块加上这个规则能堵住 Android 侧的风格混乱。一个使用技巧lint-staged 支持在命令末尾自动追加文件列表也支持用{ }占位符自定义位置。官方推荐尽量用{}明确占位尤其是在命令里还有其他参数时避免文件列表被拼到错误位置。比如*.dart: [dart format --line-length 120 --set-exit-if-changed {stagedFiles}]不过我实测下来lint-staged 15 已经能很聪明地把文件列表追加到命令末尾只要你的命令里没有 shell 的管道符和重定向就行。说到这个有个重要原则lint-staged 配置里不要写 shell 语法比如*.dart: [dart format | grep error]这种它不是你熟悉的那种 shell 执行环境。遇到这种需求正确的做法是把逻辑写进 Node 脚本再让 lint-staged 调用脚本。3.3 pre-commit hook 的安装与验证方式先编辑.husky/pre-commit把内容换成npx lint-staged如果你还要校验提交信息创建.husky/commit-msgnpx --no -- commitlint --edit $1.husky/commit-msg的$1是 git 传入的 commit message 文件路径commitlint 会读取并校验它是否规范。然后做一个快速验证故意在一个 dart 文件里把格式弄乱git add之后提交。你会在终端看到类似这样的输出✔ Preparing lint-staged... ✔ Running tasks for staged files... ✖ dart format --line-length 120 --set-exit-if-changed found some files. Please fix them and add again.这个体验的关键在于“失败信息要明确”。你见过不少 hook跑了一堆输出最后就一个Process exited with code 1开发者根本不知道错在哪。所以自定义脚本里一定要打印出问题文件路径和原因。这点我在第 5 节的脚本里会特别处理。验证完拦截后再验证一次放行把 dart 文件重新格式化、git add、提交应该能顺利通过 pre-commit。如果此时还有 commit-msg 校验注意提交信息要写成feat(module): xxx这种 conventional 格式否则会被拦下来。到这里一套最基础的 lint-staged 鸿蒙化适配已经跑通了。但我可以很负责任地说凡是只照着官方文档配的人大概率会在接下来几个环节翻车。下面就是真实的踩坑记录。4. 实测踩坑记录适配中容易翻车的四个环节4.1 Windows 开发机上 shell 与引号问题鸿蒙开发的主力设备Windows 占比不低。而 lint-staged、husky 这套工具链在 Windows 上的表现和 macOS/Linux 有一个很微妙的差异shell 语法不兼容。我遇到最典型的一个报错长这样Multiple occurrences of arguments to relative path: lib/main.dart原因是在 Windows 的 cmd.exe 或 PowerShell 环境下某些 glob 匹配和路径转义行为跟 POSIX 不同。如果你的 Git 配置使用了core.autocrlf且文件路径里有空格lint-staged 把路径传给 dart format 时引号处理不好就会报这个错。避坑方案分三层第一层统一用系统 Node Git Bash 执行 git 相关命令而不是在 cmd 里裸跑第二层lint-staged 配置里的命令尽量不要写复杂的引号嵌套第三层凡是需要复杂 shell 逻辑的命令一律收进 Node 脚本用 Node 的child_process.execFileSync或execSync执行路径引号交给代码处理比如在 Windows 上我宁愿把 dart 检查写成node scripts/check-dart-files.js也不要在 JSON 配置里直接写一串带反引号和$()的命令。这不是过度设计Windows 上踩过的坑都在细节里。4.2 dart format 与 ArkTS 风格检查的跨栈 handler第二个坑来自两个技术栈的“格式理念”不同。Dart 侧dart format --set-exit-if-changed是一个非常成熟的检查器它只有一个标准格式不对就失败。ArkTS 侧则麻烦得多DevEco Studio 的格式化器是 IDE 级的命令行封装修复不完全你很难在 git hook 里让每个 .ets 文件都过一遍“DevEco 格式标准”。我的做法是不要试图在本地 hook 完整复刻 IDE 的 ArkTS 格式化。本地 hook 的目标是抓语法错误和明显的低级问题格式问题尽量靠 IDE 的保存时自动格式化解决。所以 check-arkts-lint.js 脚本只做三件事用 tsc 的语法解析能力对 .ets 文件做语法级校验拦截明显的拼写和结构错误检查文件是否包含不可调试的残留比如console.log高频输出、TODO 约定可配只处理暂存文件不做全量编译ArkTS 是 TypeScript 的子集但包含Entry、Component、State这类装饰器和 UI 语法。直接对 .ets 文件跑tsc会误报所以在tsconfig.lint.json里开启experimentalDecorators、关掉严格类型检查让 tsc 只负责“语法对不对”类型分析交给 DevEco 和 CI。4.3 lint 命令超时与并发控制lint-staged 默认并发执行任务这在大仓库里会带来两个问题CPU 被打满或者某个命令执行太久导致 hook 超时。我见过一次真实的翻车团队为了让“每个提交都经过完整检查”在 lint-staged 里配了flutter analyze。结果每次提交都要等一两分钟因为 flutter analyze 是全量分析它根本不理会你只改了哪几个文件。开发者被拖烦了开始有人用git commit --no-verify绕过风控体系名存实亡。这个坑的教训很深刻本地 hook 要优先保证“快”超过 20 秒的检查就是在给团队制造绕过 hook 的理由。我的调整方案是lint-staged 里只放 dart format、prettier、eslint、轻量 tsc 脚本全量 flutter analyze 移到 pre-push hook 或 CI和构建任务一起跑多个 .ets 文件同时跑 tsc 时脚本内部做并发控制避免一次 fork 太多子进程如果还是觉得慢可以在 lint-staged 命令里加--concurrent false强制串行。代价是慢一点但可预测性强。4.4 commit-msg 校验与 hook 链的联动陷阱commit-msg hook 和 pre-commit 是两个独立的 hook很多人会忽略它们之间的协作关系。第一个陷阱是跳过逻辑。git commit --no-verify会同时跳过 pre-commit、commit-msg 和 pre-push 三个 hook。如果你的 CI 没有兜底校验提交信息那么--no-verify之后未规范化的提交信息会一路流到主干。我的习惯是CI 里也配置一次 commitlint 检查作为本地绕过之后的第二道防线。第二个陷阱和 Windows 有关。.husky/commit-msg里$1在 POSIX shell 下是正常的但在某些 Windows Git 环境下$1可能拿不到正确的 commit message 文件路径。现象是commitlint 报Could not find commit message file。解决方案有两个一是把.husky/commit-msg的 shebang 写成#!/usr/bin/env sh确保用 POSIX shell 执行二是干脆用 Node 脚本包装一下绕过 shell 参数解析差异#!/usr/bin/env sh node scripts/check-commit-msg.js $1check-commit-msg.js里再调用 commitlintWindows 兼容性会好很多。第三个陷阱是分支合并。如果团队用git merge合并分支默认会走 commit-msg hook而 merge commit 的信息往往不是 conventional 格式。处理办法在.husky/commit-msg里先判断$1是不是 merge 信息。最省事的方案是用--no-verify处理 merge但这让风控有漏洞。更稳妥的方案是#!/usr/bin/env sh if [ -z $MERGE_MSG ]; then npx --no -- commitlint --edit $1 fiMERGE_MSG是 git 在 merge 提交时设置的环境变量存在时跳过 commitlint避免误拦截。5. 可直接复用的 lint-staged 鸿蒙项目模板5.1 模板文件结构一览我做这套模板时目标是“开箱即用 不破坏 DevEco 体验”。文件结构如下project-root/ ├── .husky/ │ ├── pre-commit │ └── commit-msg ├── scripts/ │ ├── check-arkts-lint.js │ └── check-commit-msg.js ├── tsconfig.lint.json ├── .lintstagedrc.json ├── .commitlintrc.json ├── .editorconfig └── package.jsontsconfig.lint.json这个文件很多人会误以为它和 DevEco 的构建配置冲突。其实完全不影响它只服务 lint-staged 的本地检查不会被 DevEco 构建流程读取。你只需要在自定义脚本里显式引用它。5.2 核心配置逐行解读先看.lintstagedrc.json{ *.dart: [dart format --line-length 120 --set-exit-if-changed], *.ets: [node scripts/check-arkts-lint.js], *.{ts,tsx}: [eslint --max-warnings 0], *.{json,json5,yml,yaml,md}: [prettier --write], *.{kt,java}: [ktlint --format], !**/build/**: [], !**/oh_modules/**: [] }prettier --write和dart format有个差别prettier 会自动改写文件dart format 只有在不加--set-exit-if-changed时才会自动改写。我把 Dart 侧设为“只检测不自动改”目的是让开发者明确知道“你提交的代码格式不合格”而不只是静默改掉了。如果你更希望自动化可以把 dart 那行改成dart format --line-length 120它会直接改文件然后你需要git add把改动重新暂存。lint-staged 对此有专门的--allow-empty和重新暂存逻辑但我不建议一开始就玩这么花先让“失败”大声一点团队才会把它当回事。再看scripts/check-arkts-lint.jsconst { execSync } require(node:child_process); const path require(node:path); const files process.argv .slice(2) .filter((file) file.endsWith(.ets)) .filter((file) !file.includes(oh_modules) !file.includes(/build/)); if (files.length 0) { process.exit(0); } try { execSync( node ${path.resolve(node_modules/typescript/bin/tsc)} --noEmit -p tsconfig.lint.json ${files.map((file) ${file}).join( )}, { stdio: inherit, shell: process.platform win32 } ); } catch (error) { console.error(\n[check-arkts-lint] ArkTS 语法校验未通过请检查上面的报错信息。); process.exit(1); }这里用tsc --noEmit -p tsconfig.lint.json对暂存的 .ets 文件做语法级检查捕获明显的 import 错误、括号不配对、类型拼写问题。注意我加了shell: process.platform win32这是为了兼容 Windows 的 cmd 环境。再看tsconfig.lint.json{ compilerOptions: { target: ES2021, module: CommonJS, strict: false, noEmit: true, experimentalDecorators: true, skipLibCheck: true, moduleResolution: node } }strict: false很关键——这是故意放宽类型检查而不是让 tsc 放水。因为 ArkTS 的装饰器和 UI 声明在 tsc 看来可能是不认识的符号strict 模式下会大量误报团队很快就烦了。我们只抓语法层类型层交给 DevEco Linter 和 CI 编译。最后看.commitlintrc.json{ extends: [commitlint/config-conventional] }conventional 规则识别feat、fix、docs、style、refactor、test、chore等类型队内交流成本低也是社区最通用的标准。5.3 扩展单元测试与构建验证如何接入模板到这里只解决了格式和语法问题真正的“风控体系”还得加上测试和构建验证。我的建议是分层放置pre-commit跑 lint-staged管格式、基础静态分析、提交信息规范pre-push跑本仓库的单元测试比如flutter test以及鸿蒙侧的轻量编译检查CI跑全量flutter analyze、hvigorw assembleHap、全量单测任何一项失败都阻塞合并请求.husky/pre-push可以这样写#!/usr/bin/env sh npx lint-staged --diff HEAD~1 || true flutter test等等flutter test在 hook 里跑会很久这不是一个好建议。实际我一般不在 pre-push 里塞全量测试而是把测试放在 CI。本地 pre-push 最多跑一个“受影响的测试文件”的增量测试。真要严格就把 push 权限和 CI 状态绑定仓库管理层面用分支保护规则强制 PR 通过 CI 才能合入。这样开发者不会被本地 hook 拖死质量依然有保证。6. 从“本地能用”到“团队风控”鸿蒙化工程的进阶优化6.1 本地 hook 兜底 CI 侧二次校验这套 lint-staged 适配跑通之后我建议你把它放到一个更大的视角里看本地 hook 永远只是第一道防线不是唯一防线。原因很简单本地 hook 可以被绕过环境也可以出问题。我见过有人在 IDE 的终端里配置错了环境变量导致 hook 里的命令报command not found结果全组提交都被卡住最后只能人人--no-verify抢着提交。这是“用力过猛”的典型翻车。正确的做法是给风控体系分三层本地 pre-commit 管快速反馈CI 管完整检验分支保护管合并权限。lint-staged 只是第一层里的调度员不需要也不应该承担所有检查任务。6.2 让格式化自动落盘降低团队使用门槛一个团队工具的接纳度和它“制造麻烦”的程度成反比。如果 hook 每次都输出一大段报错开发者就必须手动去格式化体验会很差。所以我一般在跑通 lint-staged 后顺手把.editorconfig和 IDE 的格式化策略在团队内统一一遍[*] charset utf-8 end_of_line lf insert_final_newline true indent_style space indent_size 2这样大部分格式问题在保存时就被 IDE 解决了lint-staged 只在少数漏网之鱼上发挥作用。久而久之团队会形成“代码已格式化是我提交的默认前提”的肌肉记忆。6.3 大仓接入时的性能与误拦截问题如果你所在的项目是几百人规模的大仓lint-staged 的配置要额外考虑性能。我见过一个有意思的案例有人把 lint-staged 配得特别细结果一次 commit 触发十几条规则光文件列表的匹配就要几百毫秒开发者开始抱怨“提交卡顿”。优化方向有两个。第一用否定 pattern 把生成目录排除干净比如!**/oh_modules/**、!**/build/**、!**/.dart_tool/**。第二合理控制并发如果机器性能一般去掉concurrent: true的默认设置改为串行执行。宁可慢一点也别把 CPU 打满导致整个 IDE 卡死。还有一个容易被忽略的误拦截点鸿蒙工程的module.json5、build-profile.json5这类文件如果被 prettier 格式化了DevEco 偶尔会因为格式风格差异在界面上提示“文件被外部修改”。如果你遇到这种情况把 json5 单独配置为*.{json5}: []也就是不交给 prettier 处理保持 DevEco 原生格式。这不会漏掉太多价值但能避免团队里最烦人的“工具打架”。这次适配做下来我最大的体会是工具链适配的核心不是让工具认识你的代码而是让工具之间找准自己的位置。lint-staged 在鸿蒙化工程里要扮演的不是“什么都会查”的万能网关而是一个懂路由的调度员——把 Dart 的还给 Dart把 ArkTS 的还给 ArkTS把重活留给 CI。你先按这套模板把第一版跑起来观察两个星期再根据团队的抱怨集中点去调整规则和性能参数远比一开始就追求“全量拦截”稳妥得多。适配过程里如果遇到 lint-staged 在某个具体场景下的诡异报错建议先去翻它官方仓库的 issues很多坑不走到那一步你是根本不会意识到它也管不到 Windows 那段路径的。
返回列表