存储功能

存储功能 在文件系统目录中为每个组件分配隔离存储空间。这可防止组件实例访问其他组件(包括其自己的子组件)所属的文件。

不同的存储功能可能由不同的文件系统支持。组件不应假定跨存储功能可以执行原子 IO 操作。

如需了解可在组件之间共享的目录,请参阅目录功能

标准存储功能名称

标准名称通常用于存储功能。其中每个标准名称都暗示存储功能应用于特定用途并提供特定行为。收到具有以下标准名称之一的存储功能的任何组件都可能会假定它提供下述行为。

请注意,存储空间功能名称不一定能全局标识存储空间功能。例如,在某些产品中,组件实例拓扑中的不同位置存在多个名为 data 的不同存储功能。这些存储功能由不同存储卷上的不同目录提供支持,但对于使用它们的组件实例,它们都具有相同的用途。

并非所有存储功能都使用这些标准名称之一。在这些情况下,应在定义存储功能的位置以及组件实例拓扑中重命名该功能的每个位置,记录对存储功能行为的所有预期。

请注意,在测试期间,可能会创建不符合这些行为的存储功能。例如,集成测试可能会提供一个在测试用例之间被清除的 data 功能。

data

名为“data”的存储功能用于存储通用永久性数据。

某个组件可能会假定系统不会删除这些存储功能中的文件。组件必须谨慎使用 data,因为该协定不允许系统在有限的磁盘空间耗尽时删除文件。在许多情况下,使用 cache 更为合适。

cache

命名为“缓存”的存储功能旨在存储可根据需要舍弃或重新生成的数据。例如,可以重新提取的已下载图片。

存储在 cache 中的文件通常会在同一组件实例的不同运行之间保留,但不能保证。系统可能会随时删除文件,即使组件正在运行也是如此。

tmp

名为“tmp”的存储功能用于存储临时或中间数据。

在组件运行期间,系统可能会删除存储在 tmp 中的文件。在该组件运行期间,系统不会删除文件。在组件启动时,tmp 通常为空,但不能保证一定为空。组件不得假定 tmp 在启动时为空,但也不应使用启动时存在的任何文件。

后备目录

目录功能,以便为每个组件托管一个独立的子目录。当组件实例尝试通过存储功能访问为其提供的目录时,框架会在该组件的后备目录中生成一个唯一的子目录。

或静态实例 ID。每个实例 ID 都是组件 ID 索引文件中列出的 256 位全局唯一标识符。

以下是包含稳定实例 ID 的组件 ID 索引文件中的示例条目:

{
    instances: [
        {
            instance_id: "47c3bf08f3e560c4dee659c28fa8d863dbdc0b1dbb74065e6cb1f38441ac759c",
            moniker: "/core/my_component",
        },
    ],
}

借助实例 ID,组件的存储空间可以在组件的标识名称发生更改(例如将组件实例移至其他领域)后保持不变。对于测试或不需要持久存储的其他用例,使用标记是一个不错的次要方案。

如需详细了解实例 ID,请参阅组件 ID 索引

提供存储功能

如需提供存储功能,组件必须声明该功能并从 self 路由该功能。

{
    capabilities: [
        {
            storage: "tmp",
            from: "self",
            backing_dir: "memfs",
            storage_id: "static_instance_id",
        },
    ],
}

您必须使用有效的目录功能名称指定 backing_dir

from 字段声明提供后备目录的组件。如果提供程序是其他组件,您可以提供组件引用

路由存储功能

存储功能无法公开给父级组件。组件应将后备目录路由到适当的父级组件,在该组件中可以声明存储空间并提供给必要的子级。

如需详细了解该框架如何路由组件功能,请参阅功能路由

成为协作者

提供存储功能可让子组件访问该功能:

{
    offer: [
        {
            storage: "data",
            from: "self",
            to: [ "#storage-user" ],
        },
    ],
}

使用存储空间功能

如需使用存储功能,组件必须请求该功能,并在其

如需请求该 capability,请为其添加 use 声明:

{
    use: [
        {
            storage: "data",
            path: "/example_dir",
        },
    ],
}

这会在提供的 path 中填充一个目录,该目录包含隔离存储内容,从而填充组件的命名空间。

使用可选存储空间功能

请参阅 Connect 组件:使用可选功能

存储空间示例

请考虑以下示例,其中组件 A 向其父级请求隔离存储空间 tmp

// A.cml
{
    use: [
        {
            storage: "tmp",
            path: "/example_dir",
        },
    ],
}

这会在组件 A 的命名空间中提供 /example_dir 处的隔离存储目录。父级组件 B 使用同一领域中的 memfs 组件提供的后备目录向 A 提供此功能:

// B.cml
{
    capabilities: [
        {
            storage: "tmp",
            from: "#memfs",
            backing_dir: "memfs",
        },
    ],
    offer: [
        {
            storage: "tmp",
            from: "self",
            to: [ "#A" ],
        },
    ],
    children: [
        { name: "A", url: "fuchsia-pkg://...", },
        { name: "memfs", url: "fuchsia-pkg://..." },
    ],
}

如需详细了解如何实现目录,请参阅目录功能