警告
此功能为实验性功能,可能会有破坏性更改。有关更多信息,请参阅 Conan 稳定性 部分。
conan.tools.sbom¶
软件物料清单 (SBOM) 是一份文档,列出了构成特定软件的所有组件、库、依赖项和其他元素。类似于制造业中的物料清单,其中详细说明了构建产品所用的零件和材料,SBOM 提供了关于应用程序或软件系统“内部”包含内容的透明度。
Conan 允许您通过使用已解析的依赖关系图来原生生成 SBOM。这样,您可以在构建程序的同时创建 SBOM。
目前,此功能处于实验性状态,这意味着界面、功能或生成的文件将来可能会发生更改。此外,目前仅支持 CycloneDX 版本 1.4。如果您需要不同的标准、其他版本,或者您遇到任何潜在的改进,请随时在我们的 GitHub 上提出 issue。我们很高兴听到您的反馈!
CycloneDX¶
Conan 开箱即用地支持 CycloneDX,它是 SBOM 最广泛使用的标准之一。
CycloneDX 工具在 conan.tools.sbom.cyclonedx
模块中可用。它提供了 cyclonedx_1_4
函数,该函数接收 Conan 依赖关系图(通常是 conanfile.subgraph)并返回一个字典,其中包含 CycloneDX 1.4 格式的 SBOM 数据。
- cyclonedx_1_4(graph, **kwargs)¶
(实验性) 生成 json 格式的 cyclone 1.4 sbom
使用此功能非常简单,只需在您的客户端中实现一个 hook,该 hook 使用此工具创建 SBOM 并将其存储在适当的位置。
使用示例¶
让我们看两个示例
在第一个示例中,我们希望在创建应用程序时,在 package 方法之后生成 SBOM。这对于跟踪构建软件所用的组件和依赖项非常有用。在示例中,我们将生成的 sbom 保存在 package metadata 文件夹中,以保持项目井井有条
import json
import os
from conan.api.output import ConanOutput
from conan.tools.sbom.cyclonedx import cyclonedx_1_4
def post_package(conanfile, **kwargs):
sbom_cyclonedx_1_4 = cyclonedx_1_4(conanfile.subgraph)
metadata_folder = conanfile.package_metadata_folder
file_name = "sbom.cdx.json"
with open(os.path.join(metadata_folder, file_name), 'w') as f:
json.dump(sbom_cyclonedx_1_4, f, indent=4)
ConanOutput().success(f"CYCLONEDX CREATED - {conanfile.package_metadata_folder}")
在第二个示例中,我们在 generate 方法之后生成 SBOM。这允许我们在从 Conan 安装依赖项时创建 SBOM。这对于为不同版本的依赖项生成 SBOM 非常有用。请注意,这次我们将 SBOM 保存在 generators 文件夹中,以便安装依赖项的用户可以轻松访问 SBOM。
import json
import os
from conan.api.output import ConanOutput
from conan.tools.sbom.cyclonedx import cyclonedx_1_4
def post_generate(conanfile, **kwargs):
sbom_cyclonedx_1_4 = cyclonedx_1_4(conanfile.subgraph)
generators_folder = conanfile.generators_folder
file_name = "sbom.cdx.json"
os.mkdir(os.path.join(generators_folder, "sbom"))
with open(os.path.join(generators_folder, "sbom", file_name), 'w') as f:
json.dump(sbom_cyclonedx_1_4, f, indent=4)
ConanOutput().success(f"CYCLONEDX CREATED - {conanfile.generators_folder}")
这两个 hook 可以共存,这样我们可以分别为应用程序和依赖项生成 SBOM。这可以极大地帮助我们对开发过程进行持续分析并确保软件质量。
Conan¶
除了使用标准,我们可以采用“基于 Conan 的方法”。 借助 conanfile.subgraph.serialize()
函数,我们可以直接获取有关软件包依赖项的信息。 在以下示例中,我们可以看到一个 hook,它生成一个简化的 SBOM,其中包含子图的序列化,其中包括 Conan 拥有的关于特定依赖项的所有数据。 请注意,此序列化不是标准的 SBOM 格式,并且未以任何方式标准化。 该信息类似于 conan graph info ... --format=json 命令提供的信息。
import json
import os
from conan.api.output import ConanOutput
def post_package(conanfile, **kwargs):
metadata_folder = conanfile.package_metadata_folder
file_name = "sbom.conan.json"
with open(os.path.join(metadata_folder, file_name), 'w') as f:
json.dump(conanfile.subgraph.serialize(), f, indent=2)
ConanOutput().success(f"CONAN SBOM CREATED - {conanfile.package_metadata_folder}")