Composer仅识别项目根目录的LICENSE或LICENSE.md文件,其内容决定法律效力;composer.json中license字段仅为元信息,不具法律效力,且必须与LICENSE文件内容一致。

项目根目录放一个叫 LICENSE(无后缀)或 LICENSE.md 的纯文本文件,就是 Composer 识别的授权协议 —— 它不读 composer.json 里的字段,也不跑命令生成,只认这个文件存在且内容合规。
为什么 composer.json 里写 "license": "MIT" 不等于有 LICENSE 文件
那个 license 字段只是元信息,用于 Packagist 页面展示、被其他包依赖时做兼容性提示,对项目自身法律效力为零。真正起作用的是你手动提供的协议正文 —— GitHub、GitLab、CI/CD 工具、FOSS 合规扫描器(比如 FOSSA、Snyk)全靠读这个文件判断授权状态。
-
composer.json中的license值必须和LICENSE文件实际内容一致,否则会误导协作者或审计工具 - 选协议别只看名字:MIT 和 MIT-0 语义不同;Apache-2.0 要求保留 NOTICE;GPL 类协议可能影响你分发方式
- 如果项目是私有库或内部工具,也建议放一个
LICENSE,哪怕内容是Copyright (c) 2026 Your Name. All rights reserved.+Proprietary
快速生成标准 LICENSE 文件的三种靠谱方式
别手敲,容易漏年份、错格式、少空行 —— 大部分开源协议对换行和空格敏感(比如 MIT 第一行必须是完整标题)。
- 用
curl直接下载官方原文(推荐):curl -sL https://raw.githubusercontent.com/spdx/license-list-data/master/text/MIT.txt > LICENSE - 用
npx生成(需 Node.js):npx license-generator mit --fullname "Your Name" --year "2026" --output LICENSE - 从 choosealicense.com 复制对应协议正文,粘贴到新文件,保存为
LICENSE(注意:不是LICENSE.txt,也不是license.md,大小写和后缀都得对)
常见错误现象和排查点
你以为放了就完事?这几个地方最容易出问题:
- 文件名写成
LICENSE.txt或license.md→ GitHub 不识别,composer validate不报错但生态工具集体失明 - 用了中文引号、全角空格、Word 自动换行 → 协议文本失效,FOSS 扫描器直接标为 “Unknown license”
- 年份写成
2024-2026但没更新到当前年 → 虽不违法,但会被认为维护消极,部分企业采购流程卡在这里 - 私有项目用了 GPL 协议却没同步代码 → 法律上矛盾,一旦泄露可能触发强制开源义务
最常被忽略的是:LICENSE 文件必须在 git commit 里,且不能被 .gitignore 拦截 —— 它不是密钥,不是配置,是项目身份的一部分。放错位置、拼错名字、用错协议版本,比 composer.lock 错位还难被发现。










