资源模块
static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.json
和 pkg.json
文件,这个文件记录了所有可下载的资源的下载方式。
下载功能主要涉及的命令有 bin/spc download
和 bin/spc extract
。其中 download
命令是一个下载器,它会根据配置文件下载资源; extract
命令是一个解压器,它会根据配置文件解压资源。
一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。
下载器的配置文件是 source.json
,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。
每个资源的下载配置结构如下,下面是 libevent
扩展对应的资源下载配置:
{
"libevent": {
"type": "ghrel",
"repo": "libevent/libevent",
"match": "libevent.+\\.tar\\.gz",
"provide-pre-built": true,
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
这里最主要的字段是 type
,目前它支持的类型有:
url
: 直接使用 URL 下载,例如:https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz
。ghrel
: 使用 GitHub Release API 下载,即从 GitHub 项目发布的最新版本中上传的附件下载。ghtar
: 使用 GitHub Release API 下载,与ghrel
不同的是,ghtar
是从项目的最新 Release 中找source code (tar.gz)
下载的。ghtagtar
: 使用 GitHub Release API 下载,与ghtar
相比,ghtagtar
可以从tags
列表找最新的,并下载tar.gz
格式的源码(因为有些项目只使用了tag
发布版本)。bitbuckettag
: 使用 BitBucket API 下载,基本和ghtagtar
相同,只是这个适用于 BitBucket。git
: 直接从一个 Git 地址克隆项目来下载资源,适用于任何公开 Git 仓库。filelist
: 使用爬虫爬取提供文件索引的 Web 下载站点,并获取最新版本的文件名并下载。custom
: 如果以上下载方式都不能满足,你可以编写custom
后,在src/SPC/store/source/
下新建一个类,并继承CustomSourceBase
,自己编写下载脚本。
source.json 通用参数
source.json 中每个源文件拥有以下字段:
license
: 源代码的开源许可证,见下方 开源许可证 章节type
: 必须为上面提到的类型之一path
(可选): 释放源码到指定目录而非source/{name}
provide-pre-built
(可选): 是否提供预编译的二进制文件,如果为true
,则会在bin/spc download
时尝试自动下载预编译的二进制文件
TIP
source.json
中的 path
参数可指定相对路径或绝对路径。当指定为相对路径时,路径基于 source/
。
下载类型 - url
url 类型的资源指的是从 URL 直接下载文件。
包含的参数有:
url
: 文件的下载地址,如https://example.com/file.tgz
filename
(可选): 保存到本地的文件名,如不指定,则使用 url 的文件名
例子(下载 imagick 扩展,并解压缩到 php 源码的扩展存放路径):
{
"ext-imagick": {
"type": "url",
"url": "https://pecl.php.net/get/imagick",
"path": "php-src/ext/imagick",
"filename": "imagick.tgz",
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
下载类型 - ghrel
ghrel 会从 GitHub Release 中上传的 Assets 下载文件。首先使用 GitHub Release API 获取最新版本,然后根据正则匹配方式下载相应的文件。
包含的参数有:
repo
: GitHub 仓库名称match
: 匹配 Assets 文件的正则表达式prefer-stable
: 是否优先下载稳定版本(默认为false
)
例子(下载 libsodium 库,匹配 Release 中的 libsodium-x.y.tar.gz 文件):
{
"libsodium": {
"type": "ghrel",
"repo": "jedisct1/libsodium",
"match": "libsodium-\\d+(\\.\\d+)*\\.tar\\.gz",
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
下载类型 - ghtar
ghtar 会从 GitHub Release Tag 下载文件,与 ghrel
不同的是,ghtar
是从项目的最新 Release 中找 source code (tar.gz)
下载的。
包含的参数有:
repo
: GitHub 仓库名称prefer-stable
: 是否优先下载稳定版本(默认为false
)
例子(brotli 库):
{
"brotli": {
"type": "ghtar",
"repo": "google/brotli",
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
下载类型 - ghtagtar
使用 GitHub Release API 下载,与 ghtar
相比,ghtagtar
可以从 tags
列表找最新的,并下载 tar.gz
格式的源码(因为有些项目只使用了 tag
发布版本)。
包含的参数有:
repo
: GitHub 仓库名称prefer-stable
: 是否优先下载稳定版本(默认为false
)
例子(gmp 库):
{
"gmp": {
"type": "ghtagtar",
"repo": "alisw/GMP",
"license": {
"type": "text",
"text": "EXAMPLE LICENSE"
}
}
}
下载类型 - bitbuckettag
使用 BitBucket API 下载,基本和 ghtagtar
相同,只是这个适用于 BitBucket。
包含的参数有:
repo
: BitBucket 仓库名称
下载类型 - git
直接从一个 Git 地址克隆项目来下载资源,适用于任何公开 Git 仓库。
包含的参数有:
url
: Git 链接(仅限 HTTPS)rev
: 分支名称
{
"imap": {
"type": "git",
"url": "https://github.com/static-php/imap.git",
"rev": "master",
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
下载类型 - filelist
使用爬虫爬取提供文件索引的 Web 下载站点,并获取最新版本的文件名并下载。
注意,该方法仅限于镜像站、GNU 官网等具有页面 index 功能的静态站点使用。
包含的参数有:
url
: 要爬取文件最新版本的页面 URLregex
: 匹配文件名及下载链接的正则表达式
例子(从 GNU 官网下载 libiconv 库):
{
"libiconv": {
"type": "filelist",
"url": "https://ftp.gnu.org/gnu/libiconv/",
"regex": "/href=\"(?<file>libiconv-(?<version>[^\"]+)\\.tar\\.gz)\"/",
"license": {
"type": "file",
"path": "COPYING"
}
}
}
下载类型 - custom
如果以上下载方式都不能满足,你可以编写 custom
后,在 src/SPC/store/source/
下新建一个类,并继承 CustomSourceBase
,自己编写下载脚本。
这里不再赘述,你可以查看 src/SPC/store/source/PhpSource.php
或 src/SPC/store/source/PostgreSQLSource.php
作为例子。
pkg.json 通用参数
pkg.json 存放的是非源码类型的文件资源,例如 musl-toolchain、UPX 等预编译的工具。它的使用包含:
type
: 与source.json
相同的类型及不同种类的参数。extract
(可选): 下载后解压缩的路径,默认为pkgroot/{pkg_name}
。extract-files
(可选): 下载后仅解压指定的文件到指定位置。
需要注意的是,pkg.json
不涉及源代码的编译和修改分发,所以没有 license
开源许可证字段。并且你不能同时使用 extract
和 extract-files
参数。
例子(下载 nasm 到本地,并只提取程序文件到 PHP SDK):
{
"nasm-x86_64-win": {
"type": "url",
"url": "https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-2.16.01-win64.zip",
"extract-files": {
"nasm-2.16.01/nasm.exe": "{php_sdk_path}/bin/nasm.exe",
"nasm-2.16.01/ndisasm.exe": "{php_sdk_path}/bin/ndisasm.exe"
}
}
}
extract-files
中的键名为源文件夹下的文件,键值为存放的路径。存放的路径可以使用以下变量:
{php_sdk_path}
: (仅限 Windows)PHP SDK 路径{pkg_root_path}
:pkgroot/
{working_dir}
: 当前工作目录{download_path}
: 下载目录{source_path}
: 源码解压缩目录
当 extract-files
不使用变量且为相对路径时,相对路径的目录为 {working_dir}
。
开源许可证
对于 source.json
而言,每个源文件都应包含开源许可证。license
字段存放了开源许可证的信息。
每个 license
包含的参数有:
type
:file
或text
path
: 源代码目录中的许可证文件(当type
为file
时,此项必填)text
: 许可证文本(当type
为text
时,此项必填)
例子(yaml 扩展的源代码中带有 LICENSE 文件):
{
"yaml": {
"type": "git",
"path": "php-src/ext/yaml",
"rev": "php7",
"url": "https://github.com/php/pecl-file_formats-yaml",
"license": {
"type": "file",
"path": "LICENSE"
}
}
}
当开源项目拥有多个许可证时,可指定多个文件:
{
"libuv": {
"type": "ghtar",
"repo": "libuv/libuv",
"license": [
{
"type": "file",
"path": "LICENSE"
},
{
"type": "file",
"path": "LICENSE-extra"
}
]
}
}
当一个开源项目的许可证在不同版本间使用不同的文件,path
参数可以使用数组将可能的许可证文件列出:
{
"redis": {
"type": "git",
"path": "php-src/ext/redis",
"rev": "release/6.0.2",
"url": "https://github.com/phpredis/phpredis",
"license": {
"type": "file",
"path": [
"LICENSE",
"COPYING"
]
}
}
}