bun-validator
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBun Validator
Bun Validator
Validates Bun workspace configuration and prevents common monorepo issues. Ensures Bun 1.3+ patterns and proper workspace isolation.
验证Bun工作区配置,预防常见的monorepo问题。确保遵循Bun 1.3+的模式以及正确的工作区隔离。
When This Activates
触发场景
- Setting up a new Bun monorepo
- Before adding dependencies to workspaces
- Auditing existing Bun workspaces
- After AI generates package.json files
- CI/CD pipeline validation
- 搭建新的Bun monorepo
- 向工作区添加依赖之前
- 审计现有Bun工作区
- AI生成package.json文件之后
- CI/CD流水线验证
Quick Start
快速开始
bash
python3 ~/.claude/skills/bun-validator/scripts/validate.py --root .
python3 ~/.claude/skills/bun-validator/scripts/validate.py --root . --strictbash
python3 ~/.claude/skills/bun-validator/scripts/validate.py --root .
python3 ~/.claude/skills/bun-validator/scripts/validate.py --root . --strictWhat Gets Checked
检查内容
1. Bun Version
1. Bun版本
bash
undefinedbash
undefinedGOOD: v1.3+
正确:v1.3+
bun --version # 1.3.0 or higher
bun --version # 1.3.0或更高版本
BAD: v1.2 or earlier
错误:v1.2或更早版本
bun --version # 1.2.x
undefinedbun --version # 1.2.x
undefined2. Root package.json
2. 根目录package.json
GOOD - Monorepo root:
json
{
"name": "my-monorepo",
"private": true,
"workspaces": ["apps/*", "packages/*"]
}BAD - Dependencies in root:
json
{
"workspaces": ["apps/*"],
"dependencies": {
"react": "^19.0.0" // BAD: Don't put deps in root
}
}正确的Monorepo根目录配置:
json
{
"name": "my-monorepo",
"private": true,
"workspaces": ["apps/*", "packages/*"]
}错误的配置:根目录存在依赖
json
{
"workspaces": ["apps/*"],
"dependencies": {
"react": "^19.0.0" // 错误:不要在根目录放置依赖
}
}3. Workspace Structure
3. 工作区结构
GOOD:
my-monorepo/
├── package.json # Root with workspaces, private: true
├── bun.lockb # Single lockfile at root
├── apps/
│ ├── web/
│ │ └── package.json # Own dependencies
│ └── api/
│ └── package.json # Own dependencies
└── packages/
├── ui/
│ └── package.json # Shared package
└── config/
└── package.json # Shared configBAD:
my-monorepo/
├── package.json
├── apps/
│ └── web/
│ ├── package.json
│ └── bun.lockb # BAD: Lockfile in workspace正确结构:
my-monorepo/
├── package.json # 根目录包含workspaces配置,private: true
├── bun.lockb # 仅在根目录存在单个锁定文件
├── apps/
│ ├── web/
│ │ └── package.json # 拥有独立依赖
│ └── api/
│ └── package.json # 拥有独立依赖
└── packages/
├── ui/
│ └── package.json # 共享包
└── config/
└── package.json # 共享配置错误结构:
my-monorepo/
├── package.json
├── apps/
│ └── web/
│ ├── package.json
│ └── bun.lockb # 错误:锁定文件不应出现在工作区内4. Workspace Dependencies
4. 工作区依赖
GOOD - Using workspace protocol:
json
{
"dependencies": {
"@myorg/ui": "workspace:*",
"@myorg/config": "workspace:^1.0.0"
}
}BAD - Hardcoded versions:
json
{
"dependencies": {
"@myorg/ui": "1.0.0" // BAD: Use workspace:*
}
}正确:使用workspace协议
json
{
"dependencies": {
"@myorg/ui": "workspace:*",
"@myorg/config": "workspace:^1.0.0"
}
}错误:硬编码版本号
json
{
"dependencies": {
"@myorg/ui": "1.0.0" // 错误:应使用workspace:*
}
}5. Dependency Catalogs (Bun 1.3+)
5. 依赖目录(Bun 1.3+)
GOOD - Centralized versions:
json
// Root package.json
{
"catalog": {
"react": "^19.0.0",
"typescript": "^5.7.0",
"@types/node": "^22.0.0"
}
}json
// apps/web/package.json
{
"dependencies": {
"react": "catalog:" // Uses version from catalog
}
}正确:集中化版本管理
json
// 根目录package.json
{
"catalog": {
"react": "^19.0.0",
"typescript": "^5.7.0",
"@types/node": "^22.0.0"
}
}json
// apps/web/package.json
{
"dependencies": {
"react": "catalog:" // 使用目录中定义的版本
}
}6. Isolated Installs
6. 隔离安装
GOOD - Default in Bun 1.3:
Packages can only access dependencies they explicitly declare.
BAD - Hoisted dependencies:
json
// Don't disable isolation
{
"workspaces": {
"packages": ["apps/*"],
"nohoist": ["**"] // Don't do this
}
}正确:Bun 1.3默认行为
包只能访问其显式声明的依赖。
错误:依赖被提升
json
// 不要禁用隔离
{
"workspaces": {
"packages": ["apps/*"],
"nohoist": ["**"] // 不要这样做
}
}Bun 1.3+ Features
Bun 1.3+特性
Dependency Catalogs
依赖目录
Centralize version management:
json
// Root package.json
{
"catalog": {
"react": "^19.0.0",
"next": "^16.0.0",
"typescript": "^5.7.0"
}
}集中化版本管理:
json
// 根目录package.json
{
"catalog": {
"react": "^19.0.0",
"next": "^16.0.0",
"typescript": "^5.7.0"
}
}Interactive Updates
交互式更新
bash
bun update --interactive # Selectively update depsbash
bun update --interactive # 选择性更新依赖Dependency Chains
依赖链
bash
bun why react # Explain why a package is installedbash
bun why react # 解释某个包被安装的原因Workspace Commands
工作区命令
bash
undefinedbash
undefinedInstall in specific workspace
在指定工作区安装依赖
bun add express --cwd apps/api
bun add express --cwd apps/api
Run script in workspace
在工作区运行脚本
bun run --cwd apps/web dev
bun run --cwd apps/web dev
Run in all workspaces
在所有工作区运行命令
bun run --filter '*' build
undefinedbun run --filter '*' build
undefinedCommon Issues
常见问题
Issue: "Cannot find module"
问题:"Cannot find module"
Cause: Dependency not declared in workspace package.json
Fix:
bash
bun add <package> --cwd <workspace>原因: 工作区的package.json中未声明该依赖
修复方法:
bash
bun add <package> --cwd <workspace>Issue: Multiple lockfiles
问题:多个锁定文件
Cause: Running in workspace directory
bun installFix:
bash
rm apps/*/bun.lockb packages/*/bun.lockb
bun install # From root only原因: 在工作区目录中运行了
bun install修复方法:
bash
rm apps/*/bun.lockb packages/*/bun.lockb
bun install # 仅在根目录运行Issue: Version conflicts
问题:版本冲突
Cause: Same package with different versions across workspaces
Fix: Use dependency catalogs:
json
{
"catalog": {
"problematic-package": "^1.0.0"
}
}原因: 不同工作区中同一包使用了不同版本
修复方法: 使用依赖目录
json
{
"catalog": {
"problematic-package": "^1.0.0"
}
}Validation Output
验证输出示例
=== Bun Workspace Validation Report ===
Bun Version: 1.3.2 ✓
Root package.json:
✓ private: true
✓ workspaces defined
✗ Found dependencies in root (should be empty)
Workspace Structure:
✓ apps/web - valid workspace
✓ apps/api - valid workspace
✓ packages/ui - valid workspace
✗ apps/web/bun.lockb - lockfile should only be at root
Dependencies:
✓ Using workspace:* protocol
✗ @myorg/ui uses hardcoded version "1.0.0"
Catalogs:
✗ No dependency catalog found (recommended for Bun 1.3+)
Summary: 3 issues found=== Bun工作区验证报告 ===
Bun版本:1.3.2 ✓
根目录package.json:
✓ private: true
✓ 已定义workspaces
✗ 根目录存在依赖(应为空)
工作区结构:
✓ apps/web - 有效工作区
✓ apps/api - 有效工作区
✓ packages/ui - 有效工作区
✗ apps/web/bun.lockb - 锁定文件应仅存在于根目录
依赖配置:
✓ 使用了workspace:*协议
✗ @myorg/ui使用了硬编码版本"1.0.0"
依赖目录:
✗ 未找到依赖目录(Bun 1.3+推荐使用)
总结:发现3个问题Best Practices
最佳实践
1. Always use workspace protocol
1. 始终使用workspace协议
json
"@myorg/shared": "workspace:*"json
"@myorg/shared": "workspace:*"2. Use --cwd for workspace operations
2. 使用--cwd参数执行工作区操作
bash
bun add lodash --cwd apps/web # NOT: cd apps/web && bun addbash
bun add lodash --cwd apps/web # 不要这样做:cd apps/web && bun add3. Single lockfile at root
3. 仅在根目录保留单个锁定文件
bash
undefinedbash
undefinedOnly run bun install from root
仅在根目录运行bun install
bun install
undefinedbun install
undefined4. Use catalogs for shared dependencies
4. 使用依赖目录管理共享依赖
json
{
"catalog": {
"typescript": "^5.7.0",
"vitest": "^3.0.0"
}
}json
{
"catalog": {
"typescript": "^5.7.0",
"vitest": "^3.0.0"
}
}5. Declare all dependencies explicitly
5. 显式声明所有依赖
Each workspace should list all its dependencies - don't rely on hoisting.
每个工作区都应列出其所有依赖 - 不要依赖依赖提升。
CI/CD Integration
CI/CD集成
yaml
undefinedyaml
undefined.github/workflows/validate.yml
.github/workflows/validate.yml
- name: Validate Bun Workspace
run: |
python3 ~/.claude/skills/bun-validator/scripts/validate.py
--root .
--strict
--ci
undefined- name: Validate Bun Workspace
run: |
python3 ~/.claude/skills/bun-validator/scripts/validate.py
--root .
--strict
--ci
undefinedIntegration
集成能力
- - Sets up Biome with Bun
linter-formatter-init - - Creates workspace structure
project-scaffold - - Validates Next.js in workspace
nextjs-validator
- - 搭配Bun设置Biome
linter-formatter-init - - 创建工作区结构
project-scaffold - - 验证工作区中的Next.js配置
nextjs-validator