目录功能

目录功能

如需了解按组件隔离的目录,请参阅存储功能

提供目录功能

如需提供目录功能,组件必须声明该功能并从 self 路由该功能。该组件在其

如需定义该 capability,请为其添加 capabilities 声明:

{
    capabilities: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/published-data",
        },
    ],
}

这定义了此组件托管的一项 capability,其传出目录路径为 /published-data,且可用的最大权限为“只读”。

路由目录功能

组件通过向其父级公开目录功能并向其子级提供这些功能来路由目录功能。

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

公开

公开目录功能可让组件的父级访问该功能:

{
    expose: [
        {
            directory: "data",
            from: "self",
        },
    ],
}

您可以选择性地指定:

成为协作者

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

{
    offer: [
        {
            directory: "data",
            from: "parent",
            to: [ "#child-a", "#child-b" ],
        },
    ],
}

您可以选择性地指定:

使用目录功能

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

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

{
    use: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/data",
        },
    ],
}

这会使用位于所提供 path 且包含共享目录内容的目录填充组件的命名空间。

您必须指定 rights。您可以选择指定 subdir

使用可选目录功能

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

目录功能权限

目录权限可让组件在目录在整个系统中路由时控制对目录的访问权限。目录权限的应用方式如下:

  • capabilities必填。 提供目录可用的一组基本权限。useofferexpose 中指定的任何权限都必须是此处声明的权限的子集。
  • use必填。 描述使用方组件请求的访问权限。
  • offer:可选。目标组件可用的修改后的权限。如果不存在,则从 offer 来源继承权限。
  • expose:可选。目标组件可用的修改后的权限。如果不存在,则从 expose 来源继承权限。

rights 字段可以包含以下 fuchsia.io.Rights 令牌的任意组合:

rights: [
  "connect",
  "enumerate",
  "traverse",
  "read_bytes",
  "write_bytes",
  "execute_bytes",
  "update_attributes",
  "get_attributes",
  "modify_directory",
]

该框架提供了一种简化形式,用于使用别名声明 rights。每个别名都代表 FIDL 权限令牌的组合,用于提供常见的读取、写入或执行访问权限:

别名 FIDL 权利
r* connect, enumerate, traverse, read_bytes, get_attributes
w* connect, enumerate, traverse, write_bytes, update_attributes, modify_directory
x* connect, enumerate, traverse, execute_bytes
rw* connect, enumerate, traverse, read_bytes, write_bytes, get_attributes, update_attributes, modify_directory
rx* connect, enumerate, traverse, read_bytes, execute_bytes, get_attributes

rights 字段只能包含一个别名。可以附加其他 FIDL 权限,但前提是这些权限不会与别名表达的权限重复。

示例

请考虑以下示例,其中组件 A 请求对 data 目录的读写访问权限:

// A.cml
{
    use: [
        {
            directory: "data",
            rights: ["rw*"],
            path: "/data",
        },
    ],
}

但是,父组件 B 向组件 A 提供目录 data,但只提供只读权限。在这种情况下,路由会失败,并且 A 的命名空间中不会出现 data

// B.cml
{
    capabilities: [
        {
            directory: "data",
            rights: ["r*"],
            path: "/published-data",
        },
    ],
    offer: [
        {
            directory: "data",
            from: "self",
            to: [ "#A" ],
        },
    ],
}

子目录

您可以对目录功能的子目录执行 exposeofferuse 操作:

{
    offer: [
        {
            directory: "data",
            from: "parent",
            to: [ "#child-a", "#child-b" ],
            subdir: "children",
        },
    ],
}

重命名目录

您可以使用其他名称exposeoffer目录功能:

{
    offer: [
        {
            directory: "data",
            from: "#child-a",
            to: [ "#child-b" ],
            as: "a-data",
        },
    ],
}