零配置 Lint 检查 monorepo 各包依赖版本一致性并支持自动修复与 CI 集成
方案简介
Sherif 是一款面向 TypeScript 与 JavaScript monorepo 的强制性、零配置代码检查器。它的目标是在任意 monorepo 中快速运行,通过内置规则强制依赖版本统一、依赖字段规范等约束,为团队提供更好、更标准化的开发体验。与传统需要编写大量配置的 ESLint 方案不同,Sherif 开箱即用,无需配置文件,也不需要安装 node_modules 即可运行——它使用 Rust 编写,速度极快。
该方案适合使用 PNPM、Bun、NPM、Yarn 等任意包管理器管理多个 package 的团队,尤其是需要保证 monorepo 内同一依赖版本一致(如 react 与 react-dom 版本必须相同)的场景。推荐在本地修复所有错误后接入 GitHub Actions,在每次 pull request 时自动运行 Sherif 防止回归,例如向某个包添加库却忘记更新其他包中版本的情况。
亮点与能力
- ✨ 多包管理器支持:Sherif 可配合 PNPM、Bun、NPM、Yarn 等所有包管理器使用
- 🔎 零配置:无需配置文件,开箱即用并能防止回归
- ⚡ 速度快:不需要安装 node_modules,使用 Rust 编写
- 🛠 自动修复:大多数问题可通过
--fix自动修复,并自动运行包管理器 install 更新 lockfile - 🚦 退出码控制:默认任何 error 退出码为 1,可通过
--fail-on-warnings让 warning 也失败 - 🎯 细粒度忽略:可按规则(
--ignore-rule)、按包(--ignore-package)、按依赖(--ignore-dependency)忽略问题 - 🔄 版本选择策略:
--select highest或lowest可自动选择依赖的最高/最低版本
组成与分工
- Sherif:核心 Linter,扫描 monorepo 中所有 package.,检查依赖版本一致等问题,提供检查与
--fix自动修复能力 - pnpm / bunx / npx / yarn dlx:用于以一次性方式运行 Sherif 最新版,无需全局安装
- GitHub Actions(QuiiBz/sherif action):在 pull request 时自动运行 Sherif,可指定版本与参数,防止依赖版本回归
- Rust:Sherif 的实现语言,使其无需 node_modules 即可高速运行
- 各包管理器的 install 命令:autofix 后由 Sherif 自动调用以更新 lockfile
前置要求
- 一个基于 TypeScript/JavaScript 的 monorepo(包含多个 package.)
- 任一包管理器:PNPM、Bun、NPM 或 Yarn
- 无需安装 node_modules
在 monorepo 根目录运行(任选其一):
bash
PNPM
pnpm dlx sherif@latest
Bun
bunx sherif@latest
NPM
npx sherif@latest
Yarn
yarn dlx sherif@latest
实施步骤
1. 在本地运行检查
在 monorepo 根目录运行 sherif,列出发现的问题。默认情况下任何 error 都会导致退出码为 1:
bash
npx sherif@latest
2. 自动修复问题
大多数问题可使用 --fix(或 -f)自动修复。Sherif 会自动运行包管理器的 install 命令来更新 lockfile(CI 环境即 $CI 已设置时自动禁用 autofix):
bash
sherif --fix
对于 multiple-dependency-versions 规则,--fix 默认会交互式询问选择哪个版本;在非交互环境可使用 --select 自动选择最高或最低版本:
bash
Autofix and select the highest version for each dependency matching the multiple-dependency-versions rule
sherif --fix --select highest
如果不希望自动运行 install:
bash
Autofix without running the package manager's install command
sherif --fix --no-install
3. 接入 GitHub Actions
在修复所有错误后,推荐在 CI 中运行 Sherif,并固定版本号(而不是 latest)以防止回归。使用官方 Action:
yaml
name: Sherif
on:
pull_request:
jobs:
check:
name: Run Sherif
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: QuiiBz/sherif@v1
Action 会自动查找根 package. 中的 sherif 脚本并复用其参数,也可用 args 参数覆盖,或用 version 指定版本如 v1.13.0。也可直接用 npx:
yaml
- uses: actions/setup-node@v3
with:
node-version: 24
- run: npx sherif@1.13.0
使用与配置要点
- 忽略规则:
sherif -r packages-without-package- -r root-package-manager-field - 忽略某个包的所有问题:
sherif -p @repo/tools或支持通配sherif -p "./integrations/*" - 忽略特定依赖版本不一致:
sherif -i react@17.0.2 -i next@13.2.4;支持通配sherif -i @next/*;完全忽略某依赖sherif -i react -i next - 让 warning 也导致失败:使用
--fail-on-warnings选项,退出码变为 1 - 验证:运行后 Sherif 列出问题清单;无 error 时退出码为 0,有 error 时为 1,可直接作为 CI 门禁
注意事项与常见问题
- 默认任何 error 都会使 Sherif 退出码为 1,接入 CI 前需先修复所有错误
- autofix 在 CI 环境(
$CI已设置)中自动禁用 --fix处理multiple-dependency-versions时默认交互式询问,非交互环境请配合--select highest或lowest- 不想自动更新 lockfile 时使用
--no-install - CI 中建议固定版本号(如
sherif@1.13.0)而非 latest,避免工具更新带来意外失败
优缺点
- ✓ 零配置即用
- ✓ Rust 实现速度快无需 node_mo
- ✕ 错误会使 CI 退出码为 1
- ✕ 非交互环境需手动指定版本选择策略
出处
本方案挖掘自开源项目 QuiiBz/sherif,方案内容与实施命令均来自其 README 原文。
本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。