Skip to main content

管理程序罐

  • 如果您按照 "教程 "部分的教程或从实例库中克隆实例,尝试使用DFINITY Canister软件开发工具包(SDK),您就已经熟悉了如何将程序构建和部署为程序罐。本节提供了有关程序罐生命周期和如何管理程序罐的额外信息。

注册一个程序罐的标识符#

  • 根据你喜欢的开发工作流程,你可以在准备好编译的程序之前或之后注册一个唯一的程序罐标识符。例如,如果你想在编写任何代码之前为子网中的程序保留一个唯一的标识符,你可以通过运行dfx canister create命令来实现。这个命令本质上是创建一个空的程序罐占位符,以后你可以把你的代码安装进去。

要为一个程序罐注册一个唯一的标识符。

在你的本地电脑上打开一个新的终端窗口。

通过运行类似下面的命令,为你计划创建的程序罐创建一个新项目:dfx new YOUR-PROJECT-NAME

注意,你为项目使用的名称也被默认为程序罐的名称。

改变到你的新项目目录。

打开dfx.json配置文件,为你要使用的互联网计算机网络供应商设置主机和端口。

如果你使用本地主机作为互联网计算机网络供应商,你可以跳过这一步。

如果你想在编译代码之前为你认为需要的任何额外的程序罐创建标识符,你也可以选择性地改变你的程序罐的名称,或在配置文件中添加程序罐设置。

如果有必要,通过运行以下命令,启动IC服务:dfx start --background ,在大多数情况下,只有当你在本地运行 IC 网络时,这一步才是必要的。

如果你要注册在远程网络上运行的程序罐,你将包括--network命令行选项以在该网络上执行任务。

通过运行以下命令为dfx.json中定义的程序罐注册唯一的标识符:dfx canister create --all

该命令创建了.dfx/local目录,并将canister_ids.json文件添加到项目的该目录中。

构建一个具有本地标识符的程序罐#

在你为你的项目编写了源代码后,你需要把它编译成一个WebAssembly模块,然后把它作为一个程序罐部署到网络上。

如果你只是为了本地调试而编译你的项目,你可以为你的项目生成一个本地定义的标识符。

要生成一个本地定义的标识符。

创建一个具有配置设置和程序逻辑的项目,以满足你的需要。

如果有必要,启动IC服务,多数情况下,只有当你在本地运行Internet计算机网络时,这一步才是必要的。

如果你要编译在远程网络上运行的程序罐,你将包括--network命令行选项来执行该网络上的任务。

通过运行以下命令为dfx.json中定义的程序罐生成硬编码的本地标识符:dfx build --check

注意,你必须注册唯一的程序罐标识符,以取代你本地定义的标识符,然后才能在ICP上部署项目。

在因特网计算机网络上部署程序罐#

在你编译了一个程序后,你可以把编译好的代码安装在IC上,在你的开发中本地运行或在远程网络供应商上运行。

事先或在构建过程中创建的程序罐标识符决定了你的代码在部署期间的安装位置。

要首次在互联网计算机网络上部署。

打开一个新的终端,切换到你的项目目录。

如果有必要,启动IC服务,多数情况下,只有当你在本地运行Internet计算机网络时才需要这一步。

如果你是在远程网络上安装程序罐,你将包括--network命令行选项来执行该网络上的任务。

确认你有所有你要部署的程序罐的标识符。

通过运行下面的命令部署所有的程序罐:dfx canister install --all

查询一个程序罐的标识符#

所有程序罐都有唯一的、针对网络的标识符。你经常需要使用这些标识符来与程序罐互动。例如,如果你想访问一个应用程序的前端罐,或使用Candid Web界面与一个服务互动,你必须指定适当的罐标识符。

由于标识符是针对网络的,用于存储信息的文件在不同的目录中。例如,本地部署的程序罐的标识符位于项目的.dfx/local/canister_ids.json文件中。

你可以通过运行dfx canister id命令来查询任何特定程序罐的标识符。例如,要查询部署在本地网络上的查询罐的标识符,你可以运行以下命令:dfx canister id lookup

要查询部署在由ic别名指定的网络上的同一个程序罐的标识符,你可以运行下面的命令:dfx canister --network=ic id lookup

为现有的程序罐添加一个钱包#

当你进行本地开发时,创建一个新的项目会自动创建一个默认的钱包,供你在该项目中使用。如果你想为你以前创建的项目添加一个钱包,你可以通过几个手动步骤强制dfx生成一个。

要添加一个钱包用于现有的程序罐。

打开一个终端,切换到你的项目目录。如果有必要,运行以下命令,停止本地IC服务:dfx stop

删除.dfx缓存目录

通过运行下面的命令来启动IC服务:dfx start --clean

重新安装一个程序罐#

在开发周期中,你可能想安装,然后在调试和改进你的程序时替换它。

在这种情况下,你可能想保留你已经注册的程序罐标识符,但不保留任何程序罐的代码或状态。例如,你的程序罐可能只有你不想保留的测试数据,或者你可能已经决定完全改变程序,但想在你用来安装以前程序的程序罐标识符下重新安装。

要在IC重新安装,打开一个新的终端,切换到你的项目目录。如果有必要,启动IC服务,多数情况下,只有当你在本地运行Internet计算机网络时才需要这一步。

如果你是在远程网络上重新安装程序罐,你将包括--network命令行选项,在该网络上执行任务。

确认你有你想重新部署的所有程序罐的标识符。

通过运行以下命令重新部署所有的程序罐:dfx canister install --all --mode reinstall

注意,你可以使用reinstall模式来替换任何程序罐,无论该程序罐是否有代码或状态与之相关。

设置一个身份来拥有一个程序罐#

在大多数情况下,当你第一次运行dfx canister create命令时,会自动为你创建一个默认的用户身份。这个默认身份由为你的本地用户账户生成的公钥和私钥对组成。通常情况下,这个默认身份也是你创建的所有项目和你部署的所有程序罐的默认所有者。然而,你可以主动地创建和使用你选择的身份,以规避默认用户身份的使用。

作为一个例子,下面的场景说明了创建一个registered_owner身份,然后用来注册、构建、部署和调用pubs项目。

要为项目设置一个身份。

通过运行以下命令创建一个新项目:dfx new pubs

通过运行以下命令进入到项目目录:cd pubs

通过运行以下命令,在本地启动互联网计算机网络的后台:dfx start --background

通过运行下面的命令,创建一个新的registered_owner身份:dfx identity new registered_owner

通过运行下面的命令,将活动的用户环境设置为使用registered_owner身份:dfx identity use registered_owner

通过运行以下命令为项目注册、构建和部署程序罐:

dfx canister create --all
dfx build --all
dfx canister install --all

这些命令使用registered_owner身份运行,使该用户成为部署的程序罐的所有者。

通过运行下面的命令,调用greet函数来验证成功的部署:dfx canister call pubs greet '("Sam")

管理一个程序罐的运行状态#

当你在互联网计算机上部署了一个程序罐后,它可以开始接收和处理来自用户和其他程序罐的请求。可用于发送请求和接收回复的程序罐被认为处于运行状态。

尽管程序罐通常默认处于运行状态,但在某些情况下,你可能想暂时或永久地停止一个程序罐。例如,你可能想在升级之前停止一个程序罐。停止一个程序罐有助于确保正确处理任何正在进行的、需要运行完成或回滚的信息。你也可能想停止一个程序罐,以便干净地清除它的消息队列,作为删除程序罐的前提条件。

你可以通过运行dfx canister status命令来检查所有程序罐或指定程序罐的当前状态。例如,要查看本地IC服务上运行的所有程序罐的状态,你可以运行以下命令。

dfx canister status --all

如果当前正在运行的程序罐,该命令返回类似于下面的输出。

Canister status_check's status is Running.
Canister status_check_assets's status is Running.

你可以通过运行dfx canister stop命令来停止当前正在运行的程序罐:dfx canister stop --all

这个命令显示的输出与下面类似:

Stopping code for canister status_check, with canister_id 75hes-oqbaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q
Stopping code for canister status_check_assets, with canister_id cxeji-wacaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q

如果你重新运行dfx canister status命令,你可能会看到一个Stopped的状态,表示没有需要处理的未决消息,或者一个Stopping的状态,表示有需要处理的飞行中的消息。

要重新启动一个程序罐--例如,在程序罐升级成功后,你可以运行dfx程序罐启动命令。例如,要重新启动本地IC服务上运行的所有程序罐,你可以运行以下命令:dfx canister start --all

该命令显示的输出类似于以下内容:

Starting code for canister status_check, with canister_id 75hes-oqbaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q
Starting code for canister status_check_assets, with canister_id cxeji-wacaa-aaaaa-aaaaa-aaaaa-aaaaa-aaaaa-q

升级一个程序罐#

与保留程序罐标识符但不保留状态的程序罐替换不同,程序罐升级使你能够保留已部署程序罐的状态,并改变代码。

例如,假设你有一个管理职业档案和社会关系的应用程序。如果你想给应用程序添加一个新的功能,你需要能够更新程序罐的代码而不丢失任何以前存储的数据。程序罐升级使你能够在不丢失程序状态的情况下,用程序变化来更新现有的程序罐标识符。

当你升级一个用Motoko编写的程序罐时,为了保留状态,一定要使用stable关键字来确定你要保留的变量。关于在Motoko中保留变量状态的更多信息,请参见稳定的变量和升级方法。如果你正在升级一个用Rust编写的程序罐,你应该使用pre_upgradepost_upgrade函数,如Rust CDK资产存储例子中所说明的那样,以确保数据在程序罐升级后被正确保存。

要在互联网计算机网络上升级一个程序罐。

打开一个新的终端,切换到你的项目目录,如果有必要,启动Internet计算机网络,多数情况下,只有当你在本地运行Internet计算机网络时才需要这一步。

如果你是在远程网络上升级程序罐,你将包括--network命令行选项,在该网络上执行任务。

确认你有所有你想升级的程序罐的标识符。

注意,你的程序必须通过在变量声明中使用stable关键字来确定要保持状态的变量。

关于声明稳定变量的更多信息,请参阅Motoko编程语言指南。

通过运行下面的命令升级所有的程序罐:dfx canister install --all --mode upgrade

删除一个程序罐#

如果你想永久地删除一个特定的程序罐或特定项目的所有程序罐,你可以通过运行dfx canister delete命令来实现。

删除一个程序罐会将程序罐的标识符、代码和状态从因特网计算机网络中删除。然而,在你删除一个程序罐之前,你必须首先停止程序罐,以清除任何待处理的消息请求或回复。

要删除在本地因特网计算机网络上运行的项目的所有程序罐。

打开一个新的终端,切换到你的项目目录,如果有必要,启动因特网计算机网络,在大多数情况下,只有当你在本地运行Internet计算机网络时,才需要这个步骤。

如果你是在远程网络上删除程序罐,你将包括--network命令行选项,在该网络上执行任务。

通过运行下面的命令检查在本地Internet计算机网络上运行的项目罐的状态:dfx canister status --all

通过运行下面的命令停止所有的项目罐:dfx canister stop --all

通过运行下面的命令,删除所有的项目罐:dfx canister delete --all