存储功能

存储容量 在文件系统目录中分配隔离存储空间。这可以防止组件实例访问属于其他组件(包括其自己的子组件)的文件。

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

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

Standard 存储功能名称

标准名称通常用于存储空间功能。每个标准名称都暗示存储功能应用于特定目的,并且提供特定的行为。任何获得采用上述某个标准名称的存储功能的组件都可能会假定它提供下述行为。

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

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

请注意,在测试期间,可能会创建与这些行为不匹配的存储功能。例如,集成测试可能会提供在测试用例之间擦除的 data 功能。

data

名为“data”的存储功能旨在存储通用的持久性数据。

组件可能会假定系统不会删除这些存储空间容量中的文件。组件在使用 data 时必须保守,因为协定不允许系统在有限的磁盘空间用尽时删除文件。在许多情况下,建议使用 cache

cache

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

存储在 cache 中的文件通常会在同一组件实例的不同运行之间持久保留,但无法保证这一点。即使组件正在运行,系统也可以随时删除文件。

tmp

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

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

后备目录

当组件实例尝试访问通过存储功能提供给它的目录时,框架会在后备目录中为该组件生成唯一的子目录。

5每个实例 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" ],
        },
    ],
}

消耗存储空间

1

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

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

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

使用可选存储空间

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

存储空间示例

在下面的示例中,组件 A 向其父级请求隔离的存储空间 tmp

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

这会在组件 A 的命名空间的 /example_dir 中提供一个隔离的存储目录。父组件 B 使用同一 Realm 中 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://..." },
    ],
}

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