# 资源模块 static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 `source.json` 和 `pkg.json` 文件,这个文件记录了所有可下载的资源的下载方式。 下载功能主要涉及的命令有 `bin/spc download` 和 `bin/spc extract`。其中 `download` 命令是一个下载器,它会根据配置文件下载资源; `extract` 命令是一个解压器,它会根据配置文件解压资源。 一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。 下载器的配置文件是 `source.json`,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。 每个资源的下载配置结构如下,下面是 `libevent` 扩展对应的资源下载配置: ```json { "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 源码的扩展存放路径): ```json { "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 文件): ```json { "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 库): ```json { "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 库): ```json { "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`: 分支名称 ```json { "imap": { "type": "git", "url": "https://github.com/static-php/imap.git", "rev": "master", "license": { "type": "file", "path": "LICENSE" } } } ``` ## 下载类型 - filelist 使用爬虫爬取提供文件索引的 Web 下载站点,并获取最新版本的文件名并下载。 注意,该方法仅限于镜像站、GNU 官网等具有页面 index 功能的静态站点使用。 包含的参数有: - `url`: 要爬取文件最新版本的页面 URL - `regex`: 匹配文件名及下载链接的正则表达式 例子(从 GNU 官网下载 libiconv 库): ```json { "libiconv": { "type": "filelist", "url": "https://ftp.gnu.org/gnu/libiconv/", "regex": "/href=\"(?libiconv-(?[^\"]+)\\.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): ```json { "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 文件): ```json { "yaml": { "type": "git", "path": "php-src/ext/yaml", "rev": "php7", "url": "https://github.com/php/pecl-file_formats-yaml", "license": { "type": "file", "path": "LICENSE" } } } ``` 当开源项目拥有多个许可证时,可指定多个文件: ```json { "libuv": { "type": "ghtar", "repo": "libuv/libuv", "license": [ { "type": "file", "path": "LICENSE" }, { "type": "file", "path": "LICENSE-extra" } ] } } ``` 当一个开源项目的许可证在不同版本间使用不同的文件,`path` 参数可以使用数组将可能的许可证文件列出: ```json { "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" ] } } } ```