composer show --tree 不能直接生成spdx,因其仅输出无许可证信息的文本树结构,而spdx需精确包含名称、版本、许可证、url及依赖关系;它仅作为确认实际解析依赖拓扑的起点,真正生成spdx必须基于composer.lock解析。

composer show --tree 不能直接生成SPDX,但它是关键起点
SPDX(Software Package Data Exchange)要求精确描述每个依赖的名称、版本、许可证、来源URL和依赖关系。而 composer show --tree 只输出人类可读的树形结构,不含许可证字段,也不符合 SPDX JSON 或 tag-value 格式。但它能快速确认项目实际解析出的依赖拓扑,避免被 composer.lock 中未安装的包干扰。
实操建议:
- 先运行
composer install --no-dev确保vendor/与composer.lock一致,再执行composer show --tree—— 否则可能漏掉 require-dev 中被误引入的包 - 注意
composer show --tree不显示 license 字段,必须从composer.lock或包的composer.json中提取 - 若项目使用平台特定 autoloader(如 Laravel 的
OptimizedAutoloader),某些 dev-only 包可能仍被加载,需结合composer dump-autoload --no-dev验证
解析 composer.lock 是生成 SPDX 的唯一可靠方式
composer.lock 是权威源:它包含每个已安装包的 name、version、source、dist、license 和 require 映射。SPDX 要求的 PackageDownloadLocation(对应 dist.url)、PackageLicenseConcluded(需规范化 license 字符串)都只能从此文件获取。
常见错误现象:
- 直接读取 root
composer.json的require—— 忽略了传递依赖,导致 SPDX 缺失数十个子依赖 - 把
license字段原样写入 SPDX —— 如"MIT OR Apache-2.0"不是有效 SPDX 表达式,应转为MIT OR Apache-2.0(去掉引号,用空格分隔逻辑运算符) - 未处理
replace或provide字段 —— 这些包虽被安装,但 SPDX 中应标记为PackageComment: "Provided by [X] instead of standard implementation"
用 spdx-sbom-generator 或自定义 PHP 脚本生成 SPDX JSON
目前没有 Composer 官方插件直接输出 SPDX,但有两个务实选择:轻量脚本或社区工具。推荐优先试用 spdx-sbom-generator(Node.js 工具),它支持从 composer.lock 解析并自动映射常见许可证。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
实操要点:
- 安装后运行:
npx spdx-sbom-generator --type composer --input composer.lock --output sbom.spdx.json - 若遇到许可证无法识别(如
"proprietary"),工具会报错退出 —— 此时需手动在composer.lock中补全该包的license字段,或加--skip-license-validation - 自定义 PHP 脚本更可控:用
json_decode(file_get_contents('composer.lock'), true)读取,遍历packages数组,对每个包构造 SPDXpackages对象;特别注意PackageLicenseDeclared应取license数组首项(SPDX 要求单值),PackageLicenseConcluded建议设为NOASSERTION除非你人工核验过
GitHub Actions 自动化中容易忽略的路径和权限问题
在 CI 中自动生成 SPDX 并提交到仓库时,composer.lock 路径、PHP 版本和 Git 用户配置常导致失败。
关键细节:
- GitHub Actions 默认工作目录是仓库根,但若使用
actions/checkout@v4后未指定path,composer.lock可能不在当前目录 —— 应显式用run: ls -l composer.lock验证 - CI 环境中的 PHP 版本可能低于本地(如 GitHub 默认是 8.1),而某些包的
composer.lock是用 PHP 8.2 生成的,会导致json_decode解析失败 —— 加php-version: '8.2'到 setup-php 步骤 - 提交 SPDX 文件时,Git 提交者必须设置:
git config --global user.name 'SBOM Bot'和git config --global user.email 'sbom@localhost',否则 push 失败
license 字段的大小写、空格、括号嵌套层级,是 SPDX 验证器最常拒绝的地方;每次生成后用 spdx-tools validate sbom.spdx.json 扫一遍,比后期人工排查快得多。










