工作区#

JupyterLab 工作区定义了用户界面的布局和状态,例如文件、笔记本、侧边栏的位置以及面板的打开/关闭状态。

工作区可以通过三种方式管理

工作区名称只能包含 ASCII 字母(a-z 和 A-Z)、数字(0-9)、连字符(-)和下划线(_)。

管理工作区(GUI)#

从主菜单、侧边栏和命令面板中,有几个命令用于管理工作区

  • create-newclonerenameresetdelete 对服务器上 专用位置 中存储的工作区进行操作。

  • savesave asimportexport 可以将工作区加载到文件系统(包含在 Jupyter 根目录中)或从文件系统存储工作区;save 将工作区保存到最近保存的文件。

在侧边栏的“运行中的终端和内核”面板中,在“工作区”下,当前工作区有一个复选标记(✓)。单击另一个工作区将打开它。在侧边栏中,在工作区项目上打开上下文菜单(右键单击)将显示可用于管理该工作区的操作。

管理工作区(CLI)#

JupyterLab 提供了一个命令行界面用于工作区 importexport

$ # Exports the default JupyterLab workspace
$ jupyter lab workspaces export
{"data": {}, "metadata": {"id": "/lab"}}
$
$ # Exports the workspaces named `foo`
$ jupyter lab workspaces export foo
{"data": {}, "metadata": {"id": "/lab/workspaces/foo"}}
$
$ # Exports the workspace named `foo` into a file called `file_name.json`
$ jupyter lab workspaces export foo > file_name.json
$
$ # Imports the workspace file `file_name.json`.
$ jupyter lab workspaces import file_name.json
Saved workspace: <workspaces-directory>/labworkspacesfoo-54d5.jupyterlab-workspace

export 命令将为作为参数提供的任何工作区生成一个 URL,即使该工作区尚不存在。访问不存在的工作区的 URL 将创建一个具有该名称的新工作区。

import 功能会验证工作区文件的结构,并验证工作区 metadata 中的 id 字段,以确保其 URL 与 workspaces_url 配置或 page_url 配置兼容,以验证它是否是一个正确命名的工作区或它是默认工作区。

工作区文件格式#

工作区文件是一个 JSON 文件,其中包含一个具有两个必需的顶级键的对象,datametadata

metadata 必须是一个映射,其中包含一个 id 键,其值与工作区的 ID 相同。这也应该是访问工作区的相对 URL 路径,例如 /lab/workspaces/foo。此外,metadata 可能包含 createdlast_modified 字段,分别包含创建日期和时间以及最近修改日期和时间。日期和时间使用 ISO 8601 格式编码,例如 2022-06-15T23:41:15.818986+00:00

data 映射到 IStateDB 的初始状态。许多插件会在状态数据库中查找配置。此外,任何向 ILayoutRestorer 注册的插件都会在状态数据库中查找所有以其跟踪器 namespace 开头的键,这些键位于第一个 : 之前。这些键的值应该有一个 data 属性,该属性映射。

例如,如果您的工作区如下所示

{
  "data": {
    "application-mimedocuments:package.json:JSON": {
      "data": { "path": "package.json", "factory": "JSON" }
    }
  }
}

它将使用 { "path": "package.json", "factory": "JSON" } 参数运行 docmanager:open,因为 application-mimedocuments 跟踪器已向 docmanager:open 命令注册,如下所示

const namespace = 'application-mimedocuments';
const tracker = new WidgetTracker<MimeDocument>({ namespace });
void restorer.restore(tracker, {
  command: 'docmanager:open',
  args: widget => ({
    path: widget.context.path,
    factory: Private.factoryNameProperty.get(widget)
  }),
  name: widget =>
    `${widget.context.path}:${Private.factoryNameProperty.get(widget)}`
});

请注意,数据键中第一个 : 之后的部分 (package.json:JSON) 被丢弃,与之无关。