
Backstage CLI Lint 模块完全指南package lint 与 repo lint 的用法、参数与实现原理【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstagebackstage/cli-module-lint是 Backstage CLI 的官方 Lint 模块提供package lint与repo lint两个命令用于对单个包或整个仓库执行 ESLint 检查。本指南基于 module-lint.md 展开结合 lint 模块源码 与 lint 模块 package.json 详解全部命令行参数、与默认 ESLint 行为的差异、仓库级并行 lint 与成功缓存机制以及如何按需安装、覆盖或自定义该模块帮助你把它准确接入自己的 Backstage 工程流水线。模块概览lint 命令来自哪里Lint 功能由独立 CLI 模块backstage/cli-module-lint提供。从源码看模块通过createCliModule注册两条命令index.tspackage lintLint 单个包repo lintLint 整个仓库该模块属于 Backstage CLI 的模块化架构。默认情况下CLI 随backstage/cli-defaults一起打包了包括 Lint 在内的 13 个模块如果想精确控制命令集合可以只安装backstage/cli-module-lint而不用cli-defaults详见 05-modules.md 的 Using a subset of modules 一节{ devDependencies: { backstage/cli: ..., backstage/cli-module-lint: ... } }CLI 启动时会扫描项目根package.json的依赖凡backstage.role为cli-module的包都会被自动加载module-lint 的 package.json 正是这样声明的。package lint对单个包执行 lintpackage lint在默认的eslint行为之上做了三处增强见 package/lint.ts额外包含 TypeScript 文件ESLint 实例显式配置了extensions: [js, jsx, ts, tsx, mjs, cjs]见 lint.ts将警告warning视为错误——只要存在 error 或超过--max-warnings的 warning进程即以退出码 1 失败未指定具体文件时默认 lint 整个目录lintFiles(directories.length ? directories : [.])。完整用法Usage: backstage-cli package lint [options] Lint a package Options: --format format Lint report output format (default: eslint-formatter-friendly) --fix Attempt to automatically fix violations --max-warnings number Fail if more than this number of warnings. -1 allows warnings. (default: -1)参数详解参数类型默认值说明--format formatstringeslint-formatter-friendly指定 ESLint 报告输出格式。由于默认的 friendly 格式化器基于 cwd 计算文件路径源码在输出前会将 cwd 切换到仓库根目录以得到相对路径lint.ts。可传json、stylish等 ESLint 支持的格式化器--fixboolean关闭自动修复可修复的违规等价于eslint --fix修复结果通过ESLint.outputFixes写回文件lint.ts--max-warnings numbernumber-1允许的最大警告数-1表示不限制警告即只把 error 视为失败。传入其他值时warning 总数超过该值同样导致失败从源码看失败判定逻辑为任一文件的errorCount 0或在--max-warnings非-1时所有文件warningCount之和超过阈值则process.exit(1)lint.ts。典型用法# 只 lint 当前包的 src 目录 backstage-cli package lint src # 自动修复 允许最多 5 个警告 backstage-cli package lint --fix --max-warnings 5 # 输出 JSON 报告以便 CI 解析 backstage-cli package lint --format json注意源码中还支持一个文档未列出的隐藏参数--output-file path用于将报告写入文件而非 stdoutlint.ts这在 CI 归档 lint 结果时很有用。repo lint一次 lint 整个仓库repo lint会遍历项目中所有包并逐个执行 lintrepo/lint.ts。它是 monorepo 场景的主力命令包含以下选项Usage: backstage-cli repo lint [options] Lint all packages in the project Options: --format format Lint report output format (default: eslint-formatter-friendly) --since ref Only lint packages that changed since the specified ref --success-cache Enable success caching, which skips running lint for unchanged packages that were successful in the previous run --success-cache-dir path Set the success cache location, (default: node_modules/.cache/backstage-cli) --fix Attempt to automatically fix violations参数详解参数类型默认值说明--format formatstringeslint-formatter-friendly与package lint相同repo lint额外支持json格式的多包结果合并见下文--since refstring无只 lint 自指定 git ref 以来发生变更的包。实现上通过PackageGraph.listChangedPackages({ ref, analyzeLockfile: true })计算变更集合repo/lint.ts会结合 lockfile 分析依赖变更因此依赖升级的包也会被重新 lint--success-cacheboolean关闭启用成功缓存未变更且上次 lint 成功的包直接跳过大幅加速重复执行--success-cache-dir pathstringnode_modules/.cache/backstage-cli成功缓存的存放位置--fixboolean关闭自动修复可修复违规对每个包生效仓库级 lint 的实现要点从 repo/lint.ts 可以看到几个值得注意的工程细节依赖排序所有包按依赖数量从多到少排序packages.sort((a, b) depCount(b.packageJson) - depCount(a.packageJson))依赖越多的包通常越大先跑它们能让整体并行度更优repo/lint.ts。读取包自身的 lint 脚本参数repo lint会解析每个包package.json中lint脚本的参数通过createScriptOptionsParser只接受backstage-cli package lint开头的脚本见 optionsParser.ts从而保留各包在脚本中配置的--fix、--format、--max-warnings等差异化设置没有 lint 脚本的包会被过滤掉不会报错repo/lint.ts。并行 worker 执行各包通过runWorkerQueueThreads在 worker 线程中并行执行 ESLint并对 worker 中每个包的 ESLint 实例显式设置extensions: [js, jsx, ts, tsx, mjs, cjs]repo/lint.ts与package lint的 TypeScript 支持保持一致。输出策略默认只在失败的包上输出 lint 结果避免把所有包的警告刷满终端启用--success-cache时缓存命中的包会打印Skipped dir due to cache hit而成功的包会被记录到成功缓存repo/lint.ts。JSON 合并使用--format json时各失败包的 JSON 结果会被解析并合并成单个数组输出便于 CI 统一收集repo/lint.ts。典型用法# 全仓库 lint backstage-cli repo lint # 只 lint 最近一次提交以来变更的包PR 场景 backstage-cli repo lint --since origin/main # 启用成功缓存加速 CI 重复执行 backstage-cli repo lint --success-cache # 自动修复 指定缓存目录 backstage-cli repo lint --fix --success-cache --success-cache-dir .cache/backstage-cli成功缓存success-cache的工作原理--success-cache是repo lint区别于普通 lint 命令的关键特性。结合 repo/lint.ts 源码其工作机制如下对每个包计算一个 SHA-1 哈希输入包括该包在yarn.lock中的依赖树哈希、包 lint 脚本解析出的参数、当前 Node.js 版本以及实现版本号v1repo/lint.ts启用缓存时worker 对包内所有未被.gitignore或 ESLintisPathIgnored忽略的文件逐文件追加进哈希同时纳入每个文件计算出的 ESLint 配置用于感知配置文件变化见 repo/lint.ts若最终哈希命中了上一次成功运行的记录则直接跳过该包的 lint输出Skipped ...运行结束后所有成功的哈希写入缓存目录默认node_modules/.cache/backstage-cli供下次运行使用。因此只有当源码、依赖、Node 版本、lint 配置或 lint 脚本任一发生变化时包才会被重新 lint——这正是大仓库 CI 提速的关键。与构建系统 lint 流程的衔接Backstage 官方脚手架的包通常会预置lint: backstage-cli package lint脚本例如 cli-module-lint 自身的 package.json因此一条yarn lint就会落到本模块的package lint上。而 lint 配置本身由backstage/cli/config/eslint-factory统一生成例如仓库根目录的 .eslintrc.js 即是require(backstage/cli/config/eslint-factory)(__dirname, {...})的产物包含 Backstage 预设的规则集repo lint会在各包目录下加载这些配置并以process.cwd()指向包目录来保证tsconfig与 import 解析等依赖 cwd 的规则工作正常repo/lint.ts。关于 lint 配置的完整介绍如eslint-factory如何生成.eslintrc、eslint-plugin的规则集参见构建系统文档的 Linting 小节。自定义与扩展如果你需要改动 Lint 行为优先考虑以下方式而不是直接修改本模块源码覆盖默认模块将自研的cli-module例如mycompany/cli-module-lint加入根package.json它会以相同命令路径覆盖默认模块与backstage/cli-defaults冲突时单独安装的模块优先生效见 05-modules.md 的 Overriding a module 一节。只装需要的模块用backstage/cli-module-lint替代backstage/cli-defaults并搭配其他backstage/cli-module-*让命令集合最小化。借助脚本差异化利用repo lint对每个包lint脚本参数的解析在各包中为package lint追加--fix、--max-warnings等个性化选项实现按包粒度的 lint 策略。小结package lint面向单包在标准 ESLint 之上补齐了 TS 支持、warning 严格化和整目录默认扫描repo lint面向整个 monorepo提供--since增量扫描、--success-cache成功缓存、依赖排序与并行 worker 执行两个命令均以退出码 1 表达失败可直接接入 CI 门禁通过 CLI 模块机制你可以最小化安装、覆盖甚至自定义 lint 命令保持工程内工具链的整洁与可控。在 CI 中推荐组合backstage-cli repo lint --since base-ref --success-cache --format json既能聚焦本次变更、又能利用缓存加速同时产出结构化报告。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考