为什么你应该始终在 PHP 项目中检查许可证
Source: Dev.to
当我们在 PHP 项目中考虑 依赖 时,通常会关注安全性、性能和维护性。然而,有一个关键方面常常被忽视:软件许可证。
无论你是在构建开源库、商业 SaaS,还是私有内部应用,依赖的许可证都至关重要。忽视它们可能导致法律风险、合规问题以及意想不到的义务。
Composer 提供了一个内置命令来帮助处理此问题:
composer licenses
在本文中,我们将探讨为何许可证检查是必不可少的,以及如何使用 Composer 的工具——尤其是 summary(摘要)和 JSON 输出格式——来保持项目的合规性和可控性。
为什么许可证合规很重要(即使是应用程序)
一种常见的误解是:
“我在构建一个应用程序,而不是开源库;许可证并不重要。”
这并不正确。检查项目中使用的许可证对于多个重要原因是必不可少的。
法律义务
某些许可证(例如 GPL)可能要求您:
- 公开源代码
- 对衍生作品使用相同的许可证
- 提供署名或许可证文本
商业限制
某些许可证与专有软件或付费产品不兼容。
前瞻性考虑
今天的内部工具可能会变成:
- 开源项目
- 商业产品
- 更大生态系统的一部分
CI/CD 与合规
许多公司要求在以下环节进行许可证审计:
- 安全审查
- 供应商评估
- 发布流水线
了解您所依赖的内容不是可选项,而是负责任的软件开发。
使用 composer licenses -f summary 获取概览
了解项目许可证分布的最快方法是:
composer licenses -f summary
该命令会生成一个表格,列出每种许可证以及使用该许可证的包的数量。示例输出:
-------------- ------------------------
License Number of dependencies
-------------- ------------------------
MIT 81
BSD-3-Clause 33
BSD-2-Clause 2
GPL-2.0-only 2
GPL-3.0-only 2
proprietary 1
Apache-2.0 1
-------------- ------------------------
摘要信息的含义
- MIT / BSD / Apache – 通常是宽松的许可证,对大多数项目来说是安全的。
- GPL‑2.0‑only / GPL‑3.0‑only – 强制性 copyleft 许可证,可能会对再分发提出要求。
- proprietary – 红色警示,需要手动审查。
如果想进一步了解开源许可证,请访问 Open Source Initiative 许可证列表。
该摘要输出非常适合:
- 快速审计
- 编写文档
- 团队讨论
- 判断是否需要更深入的分析
然而,它并未指明哪些具体包使用了这些许可证。若需此信息,请使用 JSON 输出格式。
更深入使用 composer licenses -f json
对于自动化检查或详细分析,Composer 可以输出机器可读的数据:
composer licenses -f json
JSON 包含:
- 项目元数据(
name、version、license) - 一个
dependencies对象,其中每个依赖项包含其version和一个或多个license条目
示例:
{
"name": "laravel/laravel",
"version": "dev-main",
"license": ["MIT"],
"dependencies": {
"brick/math": {
"version": "0.14.1",
"license": ["MIT"]
},
"some/gpl-package": {
"version": "1.2.3",
"license": ["GPL-3.0-only"]
}
}
}
此格式非常适用于:
- CI 流水线
- 自定义策略执行
- 报告工具
- 自动化警报
检查 PHP 的许可证策略
一旦获得 JSON 输出,你就可以自动验证所有依赖是否符合组织允许的许可证列表。
假设项目只允许以下许可证:
MIT;BSD-2-Clause;BSD-3-Clause;Apache-2.0
一个小的 PHP 脚本可以检测不被允许的许可证:
/dev/null', $output, $exitCode);
if ($exitCode !== 0) {
fwrite(STDERR, "Failed to execute composer licenses\n");
exit(1);
}
$data = json_decode(implode("\n", $output), true);
// Check dependencies
foreach ($data['dependencies'] as $name => $package) {
$licenses = $package['license'] ?? [];
// If none of the licenses are in the allowed list, report it
if (!array_intersect($licenses, $allowedLicenses)) {
echo sprintf(
"%s (%s) -> %s\n",
$name,
$package['version'] ?? 'unknown',
$licenses ? implode(', ', $licenses) : 'NO LICENSE'
);
}
}
该脚本:
- 直接运行
composer licenses -f json - 安全地解析输出
- 将每个依赖的许可证与白名单进行比对
- 报告违反策略的包
你可以轻松将其扩展为:
- 使 CI 构建失败
- 生成合规报告
- 发送警报
- 对特定包进行白名单或黑名单管理
为什么在实践中检查许可证很重要
自动化许可证检查:
- 防止意外的许可证违规
- 保护公司和客户
- 使合规性可重复、可审计
- 鼓励更好的依赖卫生
最重要的是,它将许可证合规从“可有可无”的事后考虑转变为开发工作流的核心部分。
要点: 使用 composer licenses -f summary 快速概览,使用 composer licenses -f json 并结合小脚本(或专用工具)进行自动化、基于策略的合规检查。这能让你的 PHP 项目在法律上安全,并随时准备开发。
最后思考
Composer 已经提供了工具——只需使用它们。
- 使用
composer licenses -f summary快速概览。 - 使用
composer licenses -f json进行自动化和深入分析。 - 在问题出现之前尽早集成许可证检查。
依赖管理不仅仅是代码。
它也是关于 责任。