mcpField
D
dependency-management

dependency-management

github.com/curiositech开发257130 次安装今天更新
代码仓库

关于 dependency-management

用于管理第三方依赖整个生命周期的 Skill,涵盖选型、锁定、审计、更新和移除。它为开发团队提供安全、许可证合规与构建可复现方面的实践指导及工具示例。

主要功能

  1. 01依赖选型与版本锁定指导
  2. 02自动更新工作流规划
  3. 03安全与许可证审计
  4. 04供应链威胁检测
  5. 05锁文件与覆盖项实践

适用场景

  1. 01评估是否添加某个依赖
  2. 02规划 Renovate 或 Dependabot 更新
  3. 03调查漏洞与 CVE
  4. 04检查依赖许可证并生成 SBOM

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/curiositech/some_claude_skills --skill dependency-management

安装后在 Claude Code 中输入/dependency-management确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.claude-plugin/
plugin.json
references/
security-auditing.md
update-strategies.md

详细介绍

依赖管理

第三方依赖既是现代软件中最强大的部分,也是最危险的部分。一次依赖管理不当就造成了 log4shell 事件。Left-pad 在 11 分钟内导致数千个构建失败。通过依赖混淆发动的供应链攻击波及了大型企业。本技能涵盖依赖的完整生命周期:以面向生产环境的严谨标准进行选择、锁定版本、审计、更新和移除。

何时使用

适用于:

  • 决定是否添加新的依赖
  • 制定版本锁定策略(精确版本、范围或仅使用锁文件)
  • 设置自动更新工作流(Renovate、Dependabot)
  • 使用 npm audit、pip audit、Snyk、Socket.dev 进行安全审计
  • 扫描许可证合规性(MIT/Apache/GPL 兼容性)
  • 生成软件物料清单(SBOM)
  • 解决 peer 依赖冲突和 npm overrides
  • 响应安全公告和 CVE
  • 检测仿冒拼写攻击和依赖混淆攻击

不适用于:

  • 内部 monorepo 包管理(请使用 monorepo-management)
  • 将自己的包发布到 npm、PyPI、crates.io
  • 超出依赖管理范围的包管理器配置(工作区配置等)
  • 供应商化和隔离网络环境(请注意这些场景确实存在,但不在本指南范围内)

核心决策:我应该添加这个依赖吗?

flowchart TD
    Start[Want to add a dependency?] --> Size{How much code does it replace?}
    Size -->|< 20 lines| Write[Write it yourself]
    Size -->|20-200 lines| Q2{Trivial to implement correctly?}
    Size -->|> 200 lines| Q3{Check the package}

    Q2 -->|Yes, pure logic| Write
    Q2 -->|No, edge cases / locale / timezone| Q3

    Q3 --> Audit{Run audit checks}
    Audit --> Downloads{Weekly downloads?}
    Downloads -->|< 10k| HighRisk[High risk: low adoption]
    Downloads -->|10k-100k| MedRisk[Medium: check actively]
    Downloads -->|> 100k| Maintained{Actively maintained?}

    Maintained -->|Last commit > 2 years| Fork[Consider fork or alternative]
    Maintained -->|Recent commits| License{License compatible?}

    License -->|GPL in proprietary| Reject[REJECT: license issue]
    License -->|MIT / Apache 2.0| Security{npm audit / Socket.dev scan?}

    Security -->|CVEs unfixed| Reject
    Security -->|Clean| Transitive{Transitive dep count?}

    Transitive -->|> 50 new deps| Reconsider[Reconsider: high blast radius]
    Transitive -->|< 50 new deps| Accept[Add with pinned version]

    HighRisk --> Fork
    MedRisk --> Maintained

版本锁定策略

Semver 语义回顾
^1.2.3  = >= 1.2.3, < 2.0.0   (minor + patch updates allowed)
~1.2.3  = >= 1.2.3, < 1.3.0   (patch updates only)
1.2.3   = exactly 1.2.3        (locked)
*       = any version           (never use)
何时使用哪种策略
策略用途原因
精确锁定(1.2.3)生产应用构建可复现;锁文件提供灵活性
波浪号(~1.2.3)要发布的库补丁版本安全;次版本可能破坏使用方
插入符号(^1.2.3)仅用于开发工具对格式化工具、代码检查工具而言,可接受版本变动
以锁文件为准所有生产环境npm ci、pip install --frozen、cargo build
绝不使用 *任何场景后果严重:构建时会安装最新版本,无论是什么版本
反模式:在生产应用依赖中使用插入符号

新手:“我使用 ^,这样就能自动获取所有错误修复版本,更安全。” 专家:插入符号范围意味着任何符合 semver 规则、但可能带有破坏性变更的版本,都会在你不知情的情况下安装。Semver 只是期望,并非强制执行——软件包经常在次版本中发布破坏性变更。锁文件可以防止开发者机器上的这种情况,但运行 npm install 而不是 npm ci 的 CI 环境会悄悄升级。精确锁定直接依赖,并通过 Renovate 或 Dependabot PR 有计划地审核更新。 检测:检查生产应用的 package.json 中,运行时依赖是否带有 ^ 前缀。在全新克隆的项目上运行 npm ci,并将安装后的依赖树与上次部署时的依赖树进行比较。


更新工作流决策

flowchart TD
    Update[How to handle updates?] --> Auto{Use automation?}
    Auto -->|Yes| Tool{Which tool?}
    Auto -->|No, manual| Manual[Monthly audit: npm outdated / pip list --outdated]

    Tool -->|GitHub repo| Dependabot[GitHub Dependabot]
    Tool -->|Any platform| Renovate[Renovate Bot — more powerful]

    Dependabot --> DConfig[Configure .github/dependabot.yml]
    Renovate --> RConfig[Configure renovate.json]

    DConfig --> DGroup{Group updates?}
    RConfig --> RGroup{Group updates?}

    DGroup -->|Yes| DGrouped[Group patch updates together]
    DGroup -->|No| DPR[One PR per dependency]
    RGroup -->|Yes| RGrouped[Group by type: devDeps patch / prod minor]
    RGroup -->|No| RPR[One PR per dependency]

    RGrouped --> AutoMerge{Automerge safe?}
    DGrouped --> AutoMerge

    AutoMerge -->|Dev deps + patch only| EnableAM[Enable automerge with test gate]
    AutoMerge -->|Prod deps, major versions| RequireReview[Require human review]

安全审计

审计工具链

按以下顺序运行,从速度最快、免费的工具开始,逐步深入:

# 1. npm audit (built-in, free, fast — checks known CVEs)
npm audit
npm audit --audit-level=high    # Only high+ severity
npm audit fix                   # Auto-fix where possible
npm audit fix --force           # ⚠️ May break API — review first

# 2. pip audit (Python equivalent)
pip install pip-audit
pip-audit
pip-audit --fix                 # Write fixed requirements.txt

# 3. Socket.dev (supply chain analysis beyond CVEs)
npx socket check                # Checks for malicious behavior, typosquatting

# 4. Snyk (deeper analysis, CI integration)
npx snyk test
npx snyk monitor                # Continuous monitoring

# 5. SBOM generation (for compliance)
npx @cyclonedx/cyclonedx-npm --output-format json > sbom.json
# Python: pip install cyclonedx-bom && cyclonedx-py -p
反模式:忽略安全公告

新手:“审计发现了漏洞,但它们存在于开发依赖或未使用的代码路径中,不构成风险。” 专家:开发依赖有两种方式会影响生产环境:(1)处理生产代码的构建工具可能遭到入侵;(2)安全公告可能将软件包标为“仅限开发环境”,但该软件包实际上已包含在你的生产包中。使用 npm ls <package> 检查依赖链。对于确实仅用于开发环境的软件包(mocha、jest、eslint),可以推迟处理中等级别的安全公告。严重或高危漏洞——即使存在于开发依赖中——也应在 SLA 规定的时限内解决。“不构成风险”是一项评估,不是忽略问题的理由;请记录评估结论。 检测:运行 npm audit --production,将审计范围限定为仅用于生产环境的依赖。运行 npm ls <vulnerable-pkg>,查看所有依赖该软件包的程序。


供应链安全

拼写仿冒检测

常见攻击模式:

  • lodash → 1odash(用数字 1 替代字母 l)
  • express → expres(缺少字符)
  • react → React(大小写不同——区分大小写的注册表)
  • @org/package → org-package(作用域混淆)
# Socket.dev catches most of these
npx socket check

# Manual: verify before install
npm view <package-name>         # Check metadata: author, description, repo URL
npm view <package-name> repository  # Verify GitHub repo matches official source
依赖混淆攻击

攻击者发布一个与您的私有 @org/package 同名的公共包。由于公共包的版本号更高,包管理器会获取公共包。

预防:

# npm: Use .npmrc scoped registry config
@your-org:registry=https://your-private-registry.example.com

# Or set resolutions/overrides to lock the source
# package.json:
{
  "overrides": {
    "@your-org/internal-package": "npm:@your-org/internal-package@^1.0.0"
  }
}
锁文件完整性
# Never commit node_modules — commit only the lockfile
# Verify lockfile integrity after pulls
npm ci                          # Fails if lockfile doesn't match package.json
                                # NEVER use npm install in CI

# Python: use pip-compile for deterministic locks
pip install pip-tools
pip-compile requirements.in     # Generates pinned requirements.txt
pip-sync requirements.txt       # Install exactly this

许可证合规性

兼容性矩阵
您的项目MIT 依赖项Apache 2.0 依赖项LGPL 依赖项GPL 依赖项
专有可接受可接受(需注明出处)可接受(动态链接)拒绝
MIT/Apache可接受可接受可接受情况复杂
GPL可接受可接受可接受可接受
# Scan all licenses in your dependency tree
npx license-checker --production --onlyAllow "MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;0BSD"
npx license-checker --production --failOn "GPL;AGPL"

# Python
pip install pip-licenses
pip-licenses --format=markdown --order=license
反模式:为简单功能引入过多依赖项

新手:npm install is-odd(实际存在的包,每周下载量为 54M)。安装一个只有 1 行代码的包:n % 2 !== 0。 专家:left-pad 事件(2016 年)证明,简单的工具包会带来运营风险。每个生产依赖项都可能成为 CVE 攻击途径、供应链攻击面、语义化版本冲突源和认知负担。在添加包之前,将 README 粘贴到 ChatGPT 中并询问“核心功能是否少于 20 行?”对于日期处理、字符串工具和数学运算,请自行编写函数。对于本地化、密码学和协议解析,请使用经过实战检验的库。 检测:运行 npx cost-of-modules,或在 npm 页面查看源代码大小。对于非简单领域,大小低于 10KB 的包几乎总是可以替换。 时间线:left-pad 事件之后(2016 年),生态系统对此更加重视,但这种模式仍然存在。2024 年的 polyfill.io CDN 遭入侵事件表明,CDN 依赖项也存在同样的问题。


npm Overrides 和 Resolutions

当直接依赖项尚未更新时,可用它们修复存在漏洞的传递依赖项:

// package.json — npm overrides (npm 8.3+)
{
  "overrides": {
    "semver": ">=7.5.2",           // Force minimum version across all deps
    "lodash": "4.17.21",           // Force exact version
    "vulnerable-pkg": {
      "sub-dependency": "^2.0.0"   // Scoped: only for this parent
    }
  }
}
// package.json — yarn/pnpm resolutions
{
  "resolutions": {
    "semver": ">=7.5.2"
  }
}

注意:Overrides 可能会导致确实需要旧 API 的包无法正常工作。添加 overrides 后,务必运行测试套件。


对等依赖项

# Check what peer deps a package needs
npm info <package> peerDependencies

# npm 7+ auto-installs peer deps (may surprise you with version conflicts)
# Opt out: npm install --legacy-peer-deps (last resort)

# Check for peer dep conflicts
npm install 2>&1 | grep "peer dep"
npm ls 2>&1 | grep "WARN" | grep "peer"

规则:如果看到对等依赖项警告,不要将其忽略。这些警告表示版本不匹配,可能导致难以察觉的运行时故障。可通过将通用对等依赖项固定到兼容版本来解决。


参考资料

  • references/update-strategies.md — 查阅 Renovate 与 Dependabot 配置详情、分组策略、自动合并政策,以及安全测试更新 PR 的方法
  • references/security-auditing.md — 查阅 npm audit / Snyk / Socket.dev 的深入介绍、SBOM 生成、许可证扫描工具和 CI 集成模式

评论

支持 Markdown