如何将多个SBOM文件合并为单一CSV文件?
如何将多个SBOM文件合并为单一CSV文件?
嘿,这个需求太常见了——尤其是当你管理一堆项目,想统一查看所有依赖的时候。结合你提到的Synopsys Black Duck Hub导出的SBOM(不管是SPDX还是CycloneDX,JSON/YAML/RDF甚至tag:value格式),我给你分享几个靠谱的解决办法:
方法一:用SBOM官方工具一站式处理
这类工具专门针对SBOM格式设计,能帮你快速统一格式、合并文件并导出CSV:
- 如果你主要用CycloneDX格式,推荐用
cyclonedx-cli:- 先把所有不同格式的SBOM转成CycloneDX JSON(统一格式方便合并):
cyclonedx-cli convert --input your-sbom.spdx.rdf --output proj1-sbom.json --format json - 批量合并所有CycloneDX JSON格式的SBOM:
cyclonedx-cli merge --input-dir ./sbom-folder --output merged-sbom.json - 最后把合并后的SBOM导出为CSV:
cyclonedx-cli convert --input merged-sbom.json --output all-dependencies.csv --format csv
- 先把所有不同格式的SBOM转成CycloneDX JSON(统一格式方便合并):
- 如果你用的是SPDX格式,换成
spdx-tools就行,流程类似:先转成统一的SPDX JSON,再合并,最后导出CSV。
方法二:写自定义脚本灵活定制
如果工具的默认输出满足不了你的定制需求(比如要额外加项目名称、过滤特定依赖),写个脚本更自由:
- 举个Python的简单示例(用
cyclonedx-python-lib解析CycloneDX SBOM):import csv from cyclonedx.parser.json import JsonParser from pathlib import Path # 定义你想导出的CSV字段 csv_fields = ["所属项目", "依赖名称", "版本号", "许可证", "组件类型"] all_deps = [] # 遍历指定文件夹下的所有SBOM文件 for sbom_file in Path("./sboms").glob("*.json"): # 解析SBOM parser = JsonParser.from_file(sbom_file) bom = parser.parse() # 提取项目名称(从SBOM的元数据里取,没有就用文件名代替) proj_name = bom.metadata.name if bom.metadata.name else sbom_file.stem # 遍历所有组件(依赖) for component in bom.components: dep_info = { "所属项目": proj_name, "依赖名称": component.name, "版本号": component.version or "未指定", "许可证": component.licenses[0].id if component.licenses else "未知", "组件类型": component.type.value if component.type else "未知" } all_deps.append(dep_info) # 写入CSV文件 with open("merged-dependencies.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=csv_fields) writer.writeheader() writer.writerows(all_deps) - 要是你处理的是SPDX的tag:value格式,换成
spdx-tools的解析器就行,逻辑大同小异——核心就是解析每个SBOM,提取关键依赖字段,再统一写入CSV。
方法三:直接用Black Duck Hub的内置功能
其实你完全可以不用自己处理SBOM文件!Black Duck Hub本身就支持跨项目的依赖导出:
- 先把所有目标项目加到同一个项目组里
- 进入项目组的「依赖」视图,找到导出选项,直接选择导出为CSV格式
- 这样就能一键得到所有项目的依赖合并列表,省了不少事儿!
备注:内容来源于stack exchange,提问作者Paradox
相关产品推荐
相关产品推荐

