siemens/standard-bom-python

GitHub: siemens/standard-bom-python

西门子开源的 Python 库,用于创建和消费兼容 CycloneDX 的 Standard BOM 格式 SBOM 文档。

Stars: 12 | Forks: 1

# Python 的 Standard BOM [![构建](https://github.com/siemens/standard-bom-python/actions/workflows/ci.yml/badge.svg)](https://github.com/siemens/standard-bom-python/actions/workflows/ci.yml) ![覆盖率](https://static.pigsec.cn/wp-content/uploads/repos/cas/f6/f6a3f4ddf25cb1314375c9edee0dd61f9224a097034673e5f865dbd1dbb48b41.svg) [![GitHub Tag](https://img.shields.io/github/v/tag/siemens/standard-bom-python)](https://github.com/siemens/standard-bom-python/releases/latest) 一个用于创建和读取以下格式文档的 Python 库: [standard-bom 格式](https://sbom.siemens.io/latest/format.html)。 “Standard BOM” 是西门子内部的 SBOM 格式,基于 [Siemens CycloneDX Property Taxonomy](https://github.com/siemens/cyclonedx-property-taxonomy),它与 CycloneDX 100% 兼容。 每个 Standard BOM 文档都是 100% 的 CycloneDX 文档,因此在使用此库读取和写入 SBOM 时, CycloneDX 和 Standard BOM 格式均受到支持。 ## 安装说明 要安装该库,请运行以下命令 ... ... 对于 pip: ``` pip install siemens-standard-bom ``` ... 对于 Poetry: ``` poetry add siemens-standard-bom ``` 该库提供了 Standard BOM 解析器和序列化器类。解析器类用于从文件中读取 Standard BOM, 序列化器类用于将 Standard BOM 写入文件。 ## 从 JSON 文件中读取 Standard BOM ``` from siemens_standard_bom.parser import StandardBomParser bom = StandardBomParser.parse("sbom.cdx.json") ``` ## 将 Standard BOM 写入 JSON 文件 ``` from siemens_standard_bom.parser import StandardBomParser bom = ... StandardBomParser.save(bom, "sbom.cdx.json") ``` 如果你想跳过输出文件中的 `.dependencies` 字段,可以使用以下代码: ``` from siemens_standard_bom.parser import StandardBomParser bom = ... StandardBomParser.save(bom, "sbom.cdx.json", with_dependencies=False) ``` 这会将不带 `.dependencies` 字段的 Standard BOM 保存到文件中,该字段在 [`external` profile](https://sbom.siemens.io/v3/profiles.html) 中是 `prohibited`(禁止)的。 ## 以编程方式创建 Standard BOM 文档 `StandardBom` 类是上游库 [cyclonedx-python-lib](https://github.com/CycloneDX/cyclonedx-python-lib) 中 `cyclonedx.bom.Bom` 类的子类, 因为此库是上游库中模型对象的封装。 ``` from siemens_standard_bom.model import StandardBom, Component, ComponentType from cyclonedx.model.contact import OrganizationalContact bom = StandardBom() bom.add_author(OrganizationalContact(name='John Doe')) bom.add_tool(Component(name='Sample Tool', version='1.0.0', type=ComponentType.APPLICATION)) bom.add_component(Component(name='Sample Component', version='1.2.3', type=ComponentType.LIBRARY)) ``` 你也可以使用 Standard BOM 封装类来创建和编辑 Standard BOM 文档。 例如,你可以执行以下类似于上述示例的操作: ``` from siemens_standard_bom.model import StandardBom, Component, ComponentType, SbomComponent from cyclonedx.model.contact import OrganizationalContact bom = StandardBom() bom.add_author(OrganizationalContact(name='John Doe')) bom.add_tool(SbomComponent(Component(name='Sample Tool', version='1.0.0', type=ComponentType.APPLICATION))) bom.add_component(SbomComponent(Component(name='Sample Component', version='1.2.3', type=ComponentType.LIBRARY))) ``` ## 从 Standard BOM 对象中获取字段 当你从 `StandardBom` 对象中获取多个字段时,你会得到这些字段的 Standard BOM 封装类型。 例如,`tools` 或 `components` 获取器会返回一个 `SbomComponent` 对象列表: ``` from typing import Iterable from siemens_standard_bom.model import SbomComponent bom = ... components: Iterable[SbomComponent] = bom.components tools: Iterable[SbomComponent] = bom.tools ``` ## 为组件设置许可证 你可以通过使用 `SbomComponent` 类的 `licenses` setter 方法为组件设置许可证。`SbomComponent.licenses` setter 方法接受一个 `License` 类型的可迭代对象,它可以是 `LicenseExpression` 或 `DisjunctiveLicense`: ``` from cyclonedx.model.license import LicenseExpression component = SbomComponent(...) licenses = [LicenseExpression(value="MIT")] component.licenses = licenses ``` ## 开发说明 为了在本地 PC 上构建此库和/或为此库做出贡献,请注意以下先决条件: - [Python](https://www.python.org/doc/versions/) >=3.10, <4.0 - [Poetry](https://python-poetry.org/) >= v2.0 一旦你满足了这些先决条件,就可以在本地执行以下开发任务: - 通过执行以下命令来运行构建 poetry install 然后 poetry build 这将在 `dist/` 文件夹下生成构建产物。 - 运行包含所有测试用例的单元测试以及静态代码分析 poetry run tox run 这将为所有受支持的 Python 版本运行所有测试,以及静态 lint 和类型检查。 ## 许可证 本项目是在 [MIT 许可证](LICENSE) 下的 Inner Source 项目 (SPDX-License-Identifier: MIT)。 版权所有 (c) Siemens AG 2019-2025 保留所有权利
标签:CycloneDX, Python, SBOM, 依赖管理, 无后门, 硬件无关, 跌倒检测, 软件物料清单, 逆向工具