Fuchsia 包 URL

Fuchsia 包 URL 结构如下所示:

  1. fuchsia-pkg://{{ '<var>' }}repository{{ '</var>' }}/{{ '<var>' }}package-name{{ '</var>' }}?hash={{ '<var>' }}package-hash{{ '</var>' }}#{{ '<var>' }}resource-path{{ '</var>' }}

它包含如下组成部分,都是完整 URL 中的一部分:

URL 方案 {#url-scheme}

fuchsia-pkg URL 方案组合标识特征来建立引用存储库、包或资源的方法,具体取决于 URL 中包含哪些部分。

语法

必须

  1. {{ '<strong>' }}fuchsia-pkg://{{ '</strong>' }}<repository>[/<package-name>[?hash=<package-hash>][#<resource-path>]]

Fuchsia 包的格式是不区分大小写的字符,fuchsia-pkg://

虽然规范形式是小写形式,但 URL 方案编码是不区分大小写的,因此系统可以处理所有情况。

仓库 {#repository}

包 URL 包含仓库的 主机名 来标识一个包的源。RFC 1123RFC 5890 规定了主机名是由(.)分隔的 IDNA A-labels 序列,每一部分由以下任意顺序的 latin-1 字符组成,长度范围为 1 - 63 个:

  • 数字(09
  • 小写字母(az
  • 连接符(-

不允许出现其它字符。

包含点在内,hostname 总长度不能超过 253 字符。

仓库根验证(已知源)

仓库的根角色(一个或多个公钥或私钥对的仲裁节点)建立了一个信任链,这样包的真实性、完整性和新鲜度可以通过加密方式进行验证。根角色为更受限的角色签名,然后使用这些签名后的键来签名包的元数据及目标角色本身。更多详见 TUF 安全TUF 角色与元数据

要验证包是可信的,您必须验证从其中下载包的存储库是可信的。

这将通过在设备上维护一个已知源仓库列表和它们的公钥来实现。来自未知来源的包将被拒绝,尽管在某些构建类型上,可以在运行时添加新的仓库。

语法

必须

  1. fuchsia-pkg://{{ '<strong>' }}<repository>{{ '</strong>' }}/<package-name>?hash=<package-hash>#<resource-path>

例子

fuchsia-pkg://{{ '<strong>' }}fuchsia.com{{ '</strong>' }}

包名 {#package-name}

包名是标识软件文件的逻辑集合的符号标签,独立于这些文件的任何特定变体或修改。包名用于在存储库中定位包元数据。包元数据必须由仓库根角色信任的角色签名。

包名由以下任意顺序的至多 100 个 latin-1 字符组成:

  • 数字(09
  • 小写字母(az
  • 连字符(-
  • 下划线(_
  • 点(.

不允许其它字符。
在该仓库的所有包中,每个包名都要是唯一的。
不同仓库中的包,即使其包名一样也被认为是不同的包。

语法

必须

  1. fuchsia-pkg://<repository>/{{ '<strong>' }}<package-name>{{ '</strong>' }}?hash=<package-hash>#<resource-path>

在仓库和 包名 之间必须存在一个 / 字符。

例子

  • fuchsia-pkg://fuchsia.com/{{ '<strong>' }}fuchsia-shell-utils{{ '</strong>' }}
  • fuchsia-pkg://fuchsia.com/{{ '<strong>' }}fuchsia-shell-fonts{{ '</strong>' }}
  • fuchsia-pkg://fuchsia.com/{{ '<strong>' }}fuchsia-shell-scenic{{ '</strong>' }}

包哈希 {#package-hash}

包哈希是包 meta.far墨克根。由于包的元数据编码了包文件的内容地址,因此对包的元数据或内容的任何更改都将产生不同的包哈希,由此可以区分出包的每个唯一修订版本。

如果包散列缺失,包解析器将会从客户机可用的包的最新版本中获取该资源。

一个包哈希表示为一个十六进制编码字符串,由 64 个 latin-1 字符组成:数字(09)和小写字母(af)。不允许使用其他字符。

语法

可选

  1. fuchsia-pkg://<repository>/<package-name>{{ '<strong>' }}?hash=<package-hash>{{ '</strong>' }}#<resource-path>

只有在指定包名时才有效。

必须由字符串 ?hash= 开头,并且后面跟着 包哈希

例子

fuchsia-pkg://google.com/chrome/stable{{ '<strong>' }}?hash=80e8721f4eba5437c8b6e1604f6ee384f42aed2b6dfbfd0b616a864839cd7b4a#meta/webview.component{{ '</strong>' }}

资源路径 {#resource-path}

资源路径是一个 UTF-8 字符串,用于标识包中的资源。
这是一个文件路径,由单个 / 分隔的路径段序列组成,每个路径段都是非空序列,由不等于 .../ 的非零 UTF-8 字符组成。必须以单个 # 字符开头。

资源路径必须与包的根相关。

注意:URL 方案、仓库主机名包名包变体包哈希 部件都被定义为使用受限制的字符子集,但是与资源路径不同的是,它们对编码方式没有要求。

包含保留字符的 URL 部件按照 RFC 3986 进行百分号编码。

这个定义与 Fuchsia 文件系统路径 的定义兼容,但是它强制使用 UTF-8 编码,而不是允许任意的二进制字符串,因为这些字符串不能总是被编码为有效的 URL。

例如,hello/unicode/%F0%9F%98%81 被解码为 hello/unicode/😁

语法

可选

只在包名被指定时有效。

  1. fuchsia-pkg://<repository>/<package-name>?hash=<package-hash>{{ '<strong>' }}#<resource-path>{{ '</strong>' }}

例子

  • fuchsia-pkg://fuchsia.com/fuchsia-shell-utils/stable{{ '<strong>' }}#bin/ls{{ '</strong>' }}
  • fuchsia-pkg://google.com/chrome/stable{{ '<strong>' }}#meta/webview.component{{ '</strong>' }}
  • fuchsia-pkg://google.com/chrome/stable{{ '<strong>' }}#lib/mylibrary.so{{ '</strong>' }}