为什么你应该始终在 PHP 项目中检查许可证

发布: (2025年12月24日 GMT+8 22:00)
7 min read
原文: Dev.to

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 包含:

  • 项目元数据(nameversionlicense
  • 一个 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 进行自动化和深入分析。
  • 在问题出现之前尽早集成许可证检查。

依赖管理不仅仅是代码。
它也是关于 责任

Back to Blog

相关文章

阅读更多 »