Fuchsia 包 URL
Fuchsia 包 URL 结构如下所示:
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 中包含哪些部分。
语法
必须
{{ '<strong>' }}fuchsia-pkg://{{ '</strong>' }}<repository>[/<package-name>[?hash=<package-hash>][#<resource-path>]]
Fuchsia 包的格式是不区分大小写的字符,fuchsia-pkg://
。
虽然规范形式是小写形式,但 URL 方案编码是不区分大小写的,因此系统可以处理所有情况。
仓库 {#repository}
包 URL 包含仓库的 主机名 来标识一个包的源。RFC 1123 和 RFC 5890 规定了主机名是由(.
)分隔的 IDNA A-labels 序列,每一部分由以下任意顺序的 latin-1 字符组成,长度范围为 1 - 63 个:
- 数字(
0
到9
) - 小写字母(
a
到z
) - 连接符(
-
)
不允许出现其它字符。
包含点在内,hostname 总长度不能超过 253 字符。
仓库根验证(已知源)
仓库的根角色(一个或多个公钥或私钥对的仲裁节点)建立了一个信任链,这样包的真实性、完整性和新鲜度可以通过加密方式进行验证。根角色为更受限的角色签名,然后使用这些签名后的键来签名包的元数据及目标角色本身。更多详见 TUF 安全 和 TUF 角色与元数据。
要验证包是可信的,您必须验证从其中下载包的存储库是可信的。
这将通过在设备上维护一个已知源仓库列表和它们的公钥来实现。来自未知来源的包将被拒绝,尽管在某些构建类型上,可以在运行时添加新的仓库。
语法
必须
fuchsia-pkg://{{ '<strong>' }}<repository>{{ '</strong>' }}/<package-name>?hash=<package-hash>#<resource-path>
例子
fuchsia-pkg://{{ '<strong>' }}fuchsia.com{{ '</strong>' }}
包名 {#package-name}
包名是标识软件文件的逻辑集合的符号标签,独立于这些文件的任何特定变体或修改。包名用于在存储库中定位包元数据。包元数据必须由仓库根角色信任的角色签名。
包名由以下任意顺序的至多 100 个 latin-1 字符组成:
- 数字(
0
到9
) - 小写字母(
a
到z
) - 连字符(
-
) - 下划线(
_
) - 点(
.
)
不允许其它字符。
在该仓库的所有包中,每个包名都要是唯一的。
不同仓库中的包,即使其包名一样也被认为是不同的包。
语法
必须
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 字符组成:数字(0
到 9
)和小写字母(a
到 f
)。不允许使用其他字符。
语法
可选
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/😁
。
语法
可选
只在包名被指定时有效。
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>' }}