gumslone/laravel-package-url
GitHub: gumslone/laravel-package-url
为 Laravel 提供完整 purl 规范实现的软件包 URL 解析、构建、规范化与双向 URL 转换库。
Stars: 0 | Forks: 0
# laravel-package-url
[](https://github.com/gumslone/laravel-package-url/actions/workflows/tests.yml)
[](LICENSE)
[](https://www.paypal.com/donate/?hosted_button_id=VCWHQPACTXV5N)
[Package URL (purl)](https://github.com/package-url/purl-spec) for Laravel —
解析、构建、规范化和验证 purl,**外加** registry / repository /
下载 URL 解析、漏洞数据库 ecosystem 映射,以及
从 VCS URL 进行反向解析。
其核心是 purl 规范的忠实且轻依赖实现,通过了**整个官方 `package-url/purl-spec` 一致性测试套件**(基础
规范 + 所有 40 多种类型定义)—— 这与
[packageurl-php](https://github.com/package-url/packageurl-php) 和
[packageurl-python](https://github.com/package-url/packageurl-python) 所测试的
套件相同 —— 并且进一步提供了您在应用中实际需要的辅助功能。
## 安装说明
```
composer require gumslone/laravel-package-url
```
service provider 和 `Purl` facade 会被自动发现。
## 核心功能:解析、构建、规范化、验证
```
use Gumslone\PackageUrl\PackageUrl;
$purl = PackageUrl::fromString('pkg:composer/laravel/framework@11.55.0');
$purl->type; // "composer"
$purl->namespace; // "laravel"
$purl->name; // "framework"
$purl->version; // "11.55.0"
$purl->qualifiers; // []
$purl->subpath; // null
(string) $purl; // "pkg:composer/laravel/framework@11.55.0"
$purl->toArray(); // ['type' => 'composer', 'namespace' => 'laravel', ...]
// Build from components (with normalization + validation)
PackageUrl::fromArray([
'type' => 'PYPI',
'name' => 'Django_package',
'version' => '1.11.1',
])->toString(); // "pkg:pypi/django-package@1.11.1" (type + name normalized)
// Immutable withers + equality
$purl->withVersion('12.0.0');
$purl->withoutVersion();
$purl->equals('pkg:composer/laravel/framework@11.55.0'); // true
```
规范化遵循规范:type 会被转为小写,qualifier 键会被
转为小写/排序并丢弃空值,subpath 会被清理,并且
会应用特定类型的规则(例如 `pypi` 会将名称转为小写并将 `_` 转换为
`-`;`github`/`bitbucket`/`golang` 会将 namespace 和 name 转为小写)。无效的
purl 会抛出 `PackageUrlException` —— 包括各类型的特定规则,例如 `swift`
需要 namespace,`vcpkg`/`otp` 禁止使用 namespace,以及 `chrome-extension`
的 id/version 格式。
## 扩展功能:`Purl` facade
```
use Purl;
Purl::isValid('pkg:npm/left-pad@1.3.0'); // true
Purl::parse('pkg:npm/left-pad@1.3.0'); // PackageUrl
Purl::parseMany([...]); // Collection, invalid skipped
```
### Registry、repository 和下载 URL
```
Purl::repositoryUrl('pkg:composer/laravel/framework@11.55.0');
// https://packagist.org/packages/laravel/framework
Purl::repositoryUrl('pkg:pypi/django@5.0');
// https://pypi.org/project/django/5.0/
Purl::registryApiUrl('pkg:npm/left-pad@1.3.0');
// https://registry.npmjs.org/left-pad
Purl::downloadUrl('pkg:npm/@babel/core@7.0.0');
// https://registry.npmjs.org/@babel/core/-/core-7.0.0.tgz
Purl::downloadUrl('pkg:maven/org.apache.commons/commons-lang3@3.14.0');
// https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar
```
覆盖范围与 packageurl-python 的 `purl2url` 相匹配(并进行了扩展):
- **repositoryUrl** — cargo, bitbucket, github, gitlab, gem, cran, npm, pypi,
composer, nuget, hackage, golang, cocoapods, maven(外加 hex, pub, conda)。
- **downloadUrl** — cargo, gem, npm, maven, hackage, nuget, github, gitlab,
bitbucket, hex, golang, pub, swift, luarocks, conda, alpm, deb, apk。
`download_url` qualifier 始终具有优先权。发行版 artifact URL
(deb/apk/alpm/conda) 会读取相关的 qualifier (arch, repo, channel, …)。
### 漏洞数据库 ecosystem 映射
```
Purl::osvEcosystem('pkg:pypi/django@5.0'); // "PyPI" (OSV.dev)
Purl::osvEcosystem('pkg:composer/laravel/framework@11.0'); // "Packagist"
Purl::githubEcosystem('pkg:npm/left-pad@1.3.0'); // "NPM" (GitHub Advisories)
```
### 从 URL 反向解析
从 VCS repository URL:
```
Purl::fromRepositoryUrl('https://github.com/laravel/framework');
// pkg:github/laravel/framework
Purl::fromRepositoryUrl('git@github.com:laravel/framework.git');
// pkg:github/laravel/framework
Purl::fromRepositoryUrl('https://github.com/laravel/framework/tree/v11.0.0');
// pkg:github/laravel/framework@v11.0.0
```
从**下载 / registry URL** —— 即 `downloadUrl()` 的逆向操作:
```
Purl::fromDownloadUrl('https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz');
// pkg:npm/left-pad@1.3.0
Purl::fromDownloadUrl('https://files.pythonhosted.org/packages/ab/cd/Django-5.0-py3-none-any.whl');
// pkg:pypi/django@5.0
Purl::fromDownloadUrl('https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar');
// pkg:maven/org.apache.commons/commons-lang3@3.14.0
Purl::fromDownloadUrl('https://github.com/laravel/framework/archive/refs/tags/v11.0.0.tar.gz');
// pkg:github/laravel/framework@v11.0.0
// Try both, whichever matches
Purl::fromUrl($anyPackageOrRepoUrl);
```
识别范围涵盖(并扩展了) packageurl-python 的 `url2purl`:npm
(包括 yarnpkg 镜像)、PyPI(CDN 文件、`/packages/source`、project/JSON
API)、RubyGems、crates.io、NuGet、Maven、Go(proxy + pkg.go.dev)、Hex、
Composer/Packagist、pub.dev、CocoaPods、Hackage、LuaRocks、CRAN、SourceForge
和 Google Code 归档(→ `pkg:generic`),以及完整的 GitHub / GitLab /
Bitbucket 范围 —— 包括 web、REST API (`api.github.com/repos`)、
`codeload.github.com`、archive/release/download 以及 `raw`/`blob`/`tree`/
`commit` 引用。对于任何无法识别的内容,将返回 `null`。
## 推荐搭配使用
- [`gumslone/laravel-purl2cpe`](https://github.com/gumslone/laravel-purl2cpe) —
从精选的 scanoss/purl2cpe 数据库中将 purl 解析为其对应的 NVD CPE (vendor/product)。
## 测试
```
composer install
composer test
```
该测试套件会运行 `tests/data` 下捆绑的官方一致性测试数据。
## License
MIT。请参阅 [LICENSE](LICENSE)。捆绑的测试 fixtures 来自 package-url/purl-spec,同样遵循 MIT License。
标签:ffuf, Laravel, OpenVAS, Package URL, PHP, URL解析, 规范化, 软件组件分析