Yarn + pnpm pnpm+ Bun Bun+ NPM NPM + Rust+ Node 24+ TypeScript+ Sherif+ GitHub Actions

零配置 Lint 检查 monorepo 各包依赖版本一致性并支持自动修复与 CI 集成

✓ 零配置即用✓ Rust 实现速度快无需 node_mo ✕ 错误会使 CI 退出码为 1✕ 非交互环境需手动指定版本选择策略

方案简介

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 highestlowest 可自动选择依赖的最高/最低版本

组成与分工

  • 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 highestlowest
  • 不想自动更新 lockfile 时使用 --no-install
  • CI 中建议固定版本号(如 sherif@1.13.0)而非 latest,避免工具更新带来意外失败

优缺点

  • ✓ 零配置即用
  • ✓ Rust 实现速度快无需 node_mo
  • ✕ 错误会使 CI 退出码为 1
  • ✕ 非交互环境需手动指定版本选择策略

出处

本方案挖掘自开源项目 QuiiBz/sherif,方案内容与实施命令均来自其 README 原文。

方案出处
QuiiBz/sherif:Opinionated, zero-config linter for TypeScript & JavaScript monorepos
1184 star Opinionated, zero-config linter for TypeScript & JavaScript monorepos

本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。