import{_ as s,c as i,o as a,a1 as t}from"./chunks/framework.gjrnbxUT.js";const g=JSON.parse('{"title":"资源模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/source-module.md","filePath":"zh/develop/source-module.md"}'),n={name:"zh/develop/source-module.md"},l=t(`

资源模块

static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.jsonpkg.json 文件,这个文件记录了所有可下载的资源的下载方式。

下载功能主要涉及的命令有 bin/spc downloadbin/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,目前它支持的类型有:

source.json 通用参数

source.json 中每个源文件拥有以下字段:

TIP

source.json 中的 path 参数可指定相对路径或绝对路径。当指定为相对路径时,路径基于 source/

下载类型 - url

url 类型的资源指的是从 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 获取最新版本,然后根据正则匹配方式下载相应的文件。

包含的参数有:

例子(下载 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) 下载的。

包含的参数有:

例子(brotli 库):

json
{
  "brotli": {
    "type": "ghtar",
    "repo": "google/brotli",
    "license": {
      "type": "file",
      "path": "LICENSE"
    }
  }
}

下载类型 - ghtagtar

使用 GitHub Release API 下载,与 ghtar 相比,ghtagtar 可以从 tags 列表找最新的,并下载 tar.gz 格式的源码(因为有些项目只使用了 tag 发布版本)。

包含的参数有:

例子(gmp 库):

json
{
  "gmp": {
    "type": "ghtagtar",
    "repo": "alisw/GMP",
    "license": {
      "type": "text",
      "text": "EXAMPLE LICENSE"
    }
  }
}

下载类型 - bitbuckettag

使用 BitBucket API 下载,基本和 ghtagtar 相同,只是这个适用于 BitBucket。

包含的参数有:

下载类型 - git

直接从一个 Git 地址克隆项目来下载资源,适用于任何公开 Git 仓库。

包含的参数有:

json
{
  "imap": {
    "type": "git",
    "url": "https://github.com/static-php/imap.git",
    "rev": "master",
    "license": {
      "type": "file",
      "path": "LICENSE"
    }
  }
}

下载类型 - filelist

使用爬虫爬取提供文件索引的 Web 下载站点,并获取最新版本的文件名并下载。

注意,该方法仅限于镜像站、GNU 官网等具有页面 index 功能的静态站点使用。

包含的参数有:

例子(从 GNU 官网下载 libiconv 库):

json
{
  "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.phpsrc/SPC/store/source/PostgreSQLSource.php 作为例子。

pkg.json 通用参数

pkg.json 存放的是非源码类型的文件资源,例如 musl-toolchain、UPX 等预编译的工具。它的使用包含:

需要注意的是,pkg.json 不涉及源代码的编译和修改分发,所以没有 license 开源许可证字段。并且你不能同时使用 extractextract-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 中的键名为源文件夹下的文件,键值为存放的路径。存放的路径可以使用以下变量:

extract-files 不使用变量且为相对路径时,相对路径的目录为 {working_dir}

开源许可证

对于 source.json 而言,每个源文件都应包含开源许可证。license 字段存放了开源许可证的信息。

每个 license 包含的参数有:

例子(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"
      ]
    }
  }
}
`,75),p=[l];function h(e,k,o,E,d,r){return a(),i("div",null,p)}const u=s(n,[["render",h]]);export{g as __pageData,u as default};