← 中文资源

简体中文版本

用许可证白名单约束依赖发布

盘点生产依赖的许可证,对策略之外的 copyleft 许可证直接失败,并把报告与每次发布一起归档,避免合规义务被忽略。

阅读英文原文

概述

容器镜像会分发其中的每个依赖,而部分许可证会把义务附加到分发行为上。GPL 库被链接进交付物可能要求公开源码,AGPL 服务则可能要求向网络用户提供源码。这些不是评审意见,而是产品发布那一刻就承担的义务。要让义务始终可控,唯一可靠的方式是在 CI 中盘点许可证,让每一次依赖变化在发布前都可见。

步骤

  1. 生成仅包含生产依赖的许可证清单:
npx license-checker-rseidelsohn --production --json --out licenses.json
  1. 对禁止的许可证直接失败并输出摘要:
npx license-checker-rseidelsohn --production \
  --failOn 'GPL-3.0;AGPL-3.0;SSPL-1.0' --summary
  1. 需要例外时按包名与版本豁免,而不是关闭整条规则:
npx license-checker-rseidelsohn --production \
  --excludePackages '[email protected]' \
  --failOn 'GPL-3.0;AGPL-3.0' --summary
  1. 归档报告并与上一版本比较:
diff <(jq -S 'keys' licenses-previous.json) <(jq -S 'keys' licenses.json)

验证

预期在引入 GPL 或 AGPL 依赖后构建以退出码 1 结束,摘要中明确指出包名与许可证;仅包含宽松许可证时退出码为 0。清单文件应随发布产物归档,diff 中新出现的包会直接显示在发布检查单里。若开发依赖导致失败,说明命令缺少 --production,应只检查会被分发的代码。

注意事项

  • 扫描器读取的是包声明的元数据,不覆盖捆绑或内联代码的完整许可证文本。
  • 许可证义务属于法律问题,白名单是工程策略,不能替代法务意见。
  • 例外必须绑定包名与版本并写明到期时间,升级后重新评估。
  • 没有声明许可证的包应按“未授权”处理,而不是默认可自由使用。
  • 只依赖黑名单会漏掉版本间许可证变更,保留并比较完整清单更可靠。