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)

[](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, 依赖管理, 无后门, 硬件无关, 跌倒检测, 软件物料清单, 逆向工具