package-url/purl-spec
GitHub: package-url/purl-spec
PURL是一个最小化的软件包URL规范,用于解决跨生态系统包标识的歧义性问题,实现统一识别和跟踪。
Stars: 1030 | Forks: 228
# Package-URL (PURL) 规范
软件生态系统已演变为高度互联的组件、包和依赖项网络。管理这种复杂性需要一种强大且统一的机制,以跨不同生态系统和工具识别和跟踪软件包。Package-URL (PURL) 应运而生,旨在通过提供一种简单、一致且灵活的方法来精确、清晰地识别软件包,从而应对这一挑战。
PURL 引入了一种基于 URL 的标准化语法,可以唯一标识软件包,而与其生态系统或分发渠道无关。与传统的识别方法不同,PURL 将关键元数据直接嵌入其结构中,从而实现高效、准确的大规模软件包识别。这种标准化确保了工具和生态系统之间的互操作性,促进了更广泛的合作,并减少了软件供应链管理中的歧义。
PURL 解决的挑战:
- **软件包标识的歧义性:** 由于不同生态系统存在多样的命名约定,可靠地识别软件包历来是一项挑战。PURL 通过创建具有可预测结构的通用标识符来消除这种歧义。
- **跨生态系统互操作性:** 开发人员、组织和工具经常需要跨多个生态系统工作,而每个生态系统都有自己的包管理系统。PURL 协调了这些差异,实现了无缝的互操作性。
- **增强可追溯性与风险管理:** 在供应链安全至关重要的时代,PURL 为识别和追溯软件包的来源、依赖关系及潜在漏洞奠定了基础。
- **工具与自动化:** 通过标准化软件包识别,PURL 简化了工具开发、自动化以及软件组成分析、漏洞管理、许可证合规等任务的集成。
PURL 是一个 Ecma 标准:[ECMA-427](https://tc54.org/purl/),并且正在推进成为 ISO 标准。
## 为什么使用 PURL?
PURL 可用于通过简单且富有表达力的语法和基于熟悉 URL 的约定,可靠地引用同一个软件包。
PURL 被用作以下场景中软件组件的标准标识符:
- CycloneDX 或 SPDX 格式的软件物料清单 (SBOM)
- 大多数软件漏洞数据库,如 [OSV](https://osv.dev/)、[Sonatype OSS Index](https://ossindex.sonatype.org/) 和 [VulnerabilityCode](https://public2.vulnerablecode.io/)
- 许多软件包仓库,如 [Crates.io](https://crates.io/) 和 [Packagist](https://packagist.org/)
PURL 最近已被添加到标准 [CVE 记录格式 v5.2.0](https://github.com/CVEProject/cve-schema/releases/tag/v5.2.0) 中。
## 入门指南
一个 PURL 是一个由七个组件构成的 URL:
```
scheme:type/namespace/name@version?qualifiers#subpath
```
各组件通过特定字符分隔,以实现无歧义解析。
每个组件的定义如下:
| 组件 | 是否必需 | 描述 |
| :---------- | :------- | :--- |
| scheme | 必需 | URL 协议,固定值为 "pkg"。采用这一单一协议的主要原因之一是为了方便未来为 Package-URL 官方注册 "pkg" 协议。 |
| type | 必需 | 软件包的"类型"或"协议",如 maven, npm, nuget, gem, pypi 等。 |
| namespace | 可选 | 名称前缀,例如 Maven 的 groupid、Docker 镜像的所有者、GitHub 用户或组织。命名空间是类型特定的。 |
| name | 必需 | 软件包的名称。 |
| version | 可选 | 软件包的版本。 |
| qualifiers | 可选 | 软件包的限定符数据,例如操作系统、架构、仓库等。限定符是类型特定的。 |
| subpath | 可选 | 软件包内的子路径,相对于软件包根目录。 |
组件被设计为形成一个从左侧最重要的组件到右侧最不重要的组件的层级结构。
### 一些 PURL 示例
```
pkg:deb/debian/curl@7.50.3-1?arch=i386&distro=jessie
pkg:docker/cassandra@sha256:244fd47e07d1004f0aed9c
pkg:gem/jruby-launcher@1.1.2?platform=java
pkg:golang/google.golang.org/genproto#googleapis/api/annotations
pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io%2Frelease&packaging=sources
pkg:npm/%40angular/animation@12.3.1
pkg:nuget/EnterpriseLibrary.Common@6.0.1304
pkg:pypi/django@1.11.1
pkg:rpm/fedora/curl@7.50.3-1.fc25?arch=i386&distro=fedora-25
pkg:rpm/opensuse/curl@7.56.1-1.1.?arch=i386&distro=opensuse-tumbleweed
```
(注意:为简洁起见,docker 示例中的校验和被截断了)
### PURL 规范
PURL 规范由核心语法定义和特定的 PURL 类型定义组成:
核心 PURL 语法在 Package-URL 规范 / [ECMA-427](https://ecma-tc54.github.io/ECMA-427/) 中定义。语法详情请参见 ECMA-427 *第 5 节 Package-URL 规范*。
每个包管理器、平台、类型或生态系统都有其自身用于识别、定位和提供软件包的约定和协议。软件包**类型**是 Package-URL 中用于以短字符串(如 **maven**、**npm** 和 **pypi**)捕获此信息的组件。PURL 类型定义详情请参见 ECMA-427 *第 6 节 Package-URL 类型定义模式*。
## Package-URL 类型定义
PURL 类型定义维护在一组 JSON Schema 文件中,每个 PURL **类型**对应一个单独的文件,以及一个列出所有当前注册 PURL **类型**的简单索引。您可以在此代码库中找到全面的 PURL **类型**信息,如下所示:
- 每个 PURL 类型定义的一个 JSON 文件,位于:
https://github.com/package-url/purl-spec/tree/main/types
- 从每个 PURL 类型 JSON 定义生成的 Markdown 文档,位于:
https://github.com/package-url/purl-spec/tree/main/types-doc
- 列出所有已注册 PURL 类型的 JSON 索引,位于:
https://github.com/package-url/purl-spec/tree/main/purl-types-index.json
## 采用者
PURL 已被其他规范采用,并得到许多工具的支持。详细信息可在 [Package-URL 网站](https://www.packageurl.org/) 上找到。
- 参见[规范](https://www.packageurl.org/docs/getting-started/specgrid)了解这些规范的列表。
- 参见[工具](https://www.packageurl.org/docs/getting-started/toolgrid)了解这些工具的列表。
如果您想添加支持 PURL 的工具或规范,请在 [Package-URL 网站代码库](https://github.com/package-url/www.packageurl.org/issues) 中创建一个 issue。因为数据字段不同,有用于“添加工具”和“添加规范”的单独 issue 模板。
**注意** Package-URL 项目的“生产”网站位于:https://www.packageurl.org/。
Package-URL 还有一个“预发布网站”位于:https://package-url.github.io/www.packageurl.org/,该网站在版本发布间歇期可能包含比生产网站更新的信息。
## 支持
如果您有具体问题、建议或错误报告,请提交一个 [GitHub issue](https://github.com/package-url/purl-spec/issues)。
对于快速提问或交流,请加入 PURL 社区讨论:
- [AboutCode Slack](https://aboutcode-org.slack.com/archives/C08LBQMA7DE)
- [CycloneDX Slack](https://cyclonedx.slack.com/archives/C06KTE3BWEB)
- [Gitter](https://matrix.to/#/#package-url_Lobby:gitter.im)
## 许可证
版权所有 (c) purl 作者
**purl-spec** 软件的许可证:
- SPDX-License-Identifier: MIT
ECMA-427 标准的许可证:
- SPDX-License-Identifier: LicenseRef-scancode-ecma-standard-copyright-2024
标签:ECMA标准, GPT, TLS抓取, URL, 互操作性, 供应链管理, 依赖管理, 元数据管理, 包标识, 包管理, 工具自动化, 数据管道, 标准化, 标准化规范, 标识系统, 漏洞管理, 许可证合规, 跨生态系统, 软件安全, 软件工程, 软件组成分析, 追踪, 防御加固