Skip to main content

DFX 常用指令

DFX

命令行工具 dfx 是用于创建、部署和管理互联网计算机 (IC) 平台上的去中心化应用的主要工具,用来管理身份、账本、cycles 钱包、以及容器等。dfx 包含有二十多个子命令,每个子命令又拥有不同的子命令,使得 dfx 的功能非常强大的同时也很庞大。

这篇文章的目的并不是介绍 dfx 所有命令的用法,而是试着从开发者日常开发中着眼,列举出一些常用的 dfx 命令。如果需要查阅 dfx 说明书,请参考 dfx 官方链接

dfx

dfx 的基本用法如下:

dfx [subcommand] [flag]

dfx 命令常用的标志、参数有:

  • -h, --help
    用来输出帮助信息
  • -V, --version
    用来输出版本信息
  • --identity <identity>
    用来指定执行命令时所使用的用户身份(适用于本地有多个身份的情况)。具体身份的管理可以参考身份管理章节。

dfx 包含有二十多个子命令,常用的有 canister, deploy, identity, ledger, wallet 等,后面章节会介绍到其中的一部分,具体的所有子命令请参考官方开发文档

身份 (Identity)

dfx identity 命令和其子命令可以用来管理用于执行命令和与 IC 或本地容器执行环境通信的身份信息。它的基本用法如下:

dfx identity [subcommand] [flag]

创建身份

dfx identity new 可以用来创建一个新的用户身份。它的基本用法如下:

dfx identity new [options] <identity-name>

常用的参数和选项有:

  • <identity-name>
    用来指定创建的身份名称。
  • --storage-mode
    这个参数有两个选项:
    • password-protected
      这个是默认的选项,会提醒您为加密的 PEM 文件设置一个密码。
    • plaintext
      有些时候会用到非加密的 PEM 文件,比如在 CI 这种不提供用户交互的情况下。

下面是一个示例:

dfx identity new ic_test --storage-mode plaintext

它创建了一个非加密的名为 ic_test 的身份。

导入身份

dfx identity import 可以通过导入一个 PEM 文件来创建用户身份,它的基本用法如下:

dfx identity import [options] <identity-name> <pem_file>

它常用的参数和创建身份很相似,不同之处在于:

  • <pem_file> 用来指定需要导入的 PEM 文件。
  • --force 如果指定的 identity-name 已经存在,指定 --force 选项会覆盖原有的身份。

下面是一个示例:

dfx identity import ic_test test.pem --storage-mode plaintext

它导入当前目录下的 test.pem 文件并创建一个非加密的名为 ic_test 的身份。

删除身份

dfx identity remove 可以用来删除您不再需要的身份。它的基本用法如下:

dfx identity remove [options] <identity-name>

下面是一个示例:

dfx identity remove ic_test

它会删除名为 ic_test 的身份。

需要注意的是:对于加密的身份,在删除的时候并不需要输入身份加密时所设置的密码。

列举身份

dfx identity list 可以列举出您本机所有的身份,并显示出当前正在使用的身份,基本用法如下:

dfx identity list

以下就是笔者在本机执行该命令所输出的结果:

~$ dfx identity list
anonymous
default
first *
ic123
ic_test

以星号结尾标注的就是当前正在使用的身份。

使用身份

当您想要使用的身份并不是当前身份的时候,可以通过 dfx identity use 命令来切换身份。基本用法如下:

dfx identity use [flag] <identity-name>

下面是一个示例:

dfx identity use ic_test

它会切换当前用户身份为 ic_test

获取主体

dfx identity get-principal 可以用来显示与当前用户身份相关联的主体

下面是一个示例:

dfx identity get-principal --identity=ic_test

它会返回 ic_test 身份所关联的主体。如果当前身份就是 ic_test,则可以省略 --identity=ic_test

获取钱包

dfx identity get-wallet 可以用来显示与当前用户身份相关联的 cycles 钱包。

下面是一个示例:

dfx identity get-wallet --network ic

它会返回 IC 主网上当前身份所关联的 cycles 钱包。

设置钱包

dfx identity set-wallet 可以用来设置与当前用户身份相关联的 cycles 钱包。

下面是一个示例:

dfx identity set-wallet <canister-id> --network ic

它会在 IC 主网上设置与当前身份相关联的 cycles 钱包。

部署钱包

dfx identity deploy-wallet 可以通过在一个容器里安装钱包 Wasm 代码来创建 cycles 钱包。基本用法如下:

dfx identity deploy-wallet [flag] <canister_id>

下面是一个示例:

dfx identity deploy-wallet gastn-uqaaa-aaaae-aaafq-cai --network ic

它会在 IC 主网上在指定容器安装钱包 Wasm 代码。

以上就是 dfx identity 命令的基本用法,未列举部分请参考官方文档

账本 (Ledger)

dfx ledger 命令及其子命令可以用来与账本容器交互。它可用于从一个容器向另一个容器进行 ICP 转账,或使用 ICP 为容器充值 cycles。

它的基本用法如下:

dfx ledger [subcommand] [flag]

获取账户

dfx ledger account-id 命令返回与当前身份关联的账户 ID。同身份所关联的主体一样,帐户 ID 是从您的私钥派生、并用于在账本容器中表示您的身份。

下面是一个示例:

dfx ledger account-id

它返回当前身份相关联的账户 ID,类似如下:

03e3d86f29a069c6f2c5c48e01bc084e4ea18ad02b0eec8fccadf4487183c223

获取余额

dfx ledger balance 命令返回与当前账号的余额。

下面是一个示例:

dfx ledger balance

它返回当前账号的余额,类似如下:

2.49798000 ICP

转账

您可以使用 dfx ledger transfer 命令将 ICP 从您在账本容器中的帐户转移到目标账户。它的基本用法如下:

dfx ledger transfer [options] <to_account_id> --memo memo

常用的参数和选项有:

  • <to_account_id>
    用来指定您要转账的目标账户。
  • --memo <memo>
    用来指定该交易的数字备忘录。
  • --amount <amount>
    用来指定要转账的 ICP 数量,最多可以指定八位小数的数字。可以理解为 --amount--icp--e8s 的结合。
  • --icp <icp>
    指定 ICP 为整数,可以单独使用或与 --e8s 结合使用。
  • --e8s <e8s>
    指定 e8s 为整数。e8 是 ICP 的最小单位,例如 1.050000001ICP5000000e8s 的组合。它可以单独使用或与 --icp 结合使用。
  • --fee <fee>
    用来指定该交易的费用,默认是 10000 e8s

下面是一个示例:

dfx ledger transfer dd81336dbfef5c5870e84b48405c7b229c07ad999fdcacb85b9b9850bd60766f --memo 12345 --icp 1 --network ic

它在 IC 主网上向指定账户发起一笔数量为 1 ICP 的交易。 返回信息类似如下所示:

Transfer sent at BlockHeight: 59513

结束后您可以通过 dfx ledger balance --network ic 命令查询当前账号的余额。

充值 cycles

您可以使用 dfx ledger top-up 命令使用通过 ICP 铸造而来的 cycles 给容器充值。 它的基本用法如下:

dfx ledger top-up [options] canister_id [flag] --network ic

它常用的参数和转账很相似,比如:--amount, --icp, --e8s, --fee 等。不同之处在于:

  • <canister_id>
    用来指定您要充值的容器 ID。

下面是一个示例:

dfx ledger top-up --icp 1 5a46r-jqaaa-aaaaa-qaadq-cai --network ic

它在 IC 主网上向指定容器充值价值为 1 ICP 的 cycles。如果转账成功会返回类似如下所示信息:

Transfer sent at BlockHeight: 59482
Canister was topped up!

制造 cycles

您可使用 dfx ledger fabricate-cycles 向指定的容器存入 cycles。这些 cycles 都是虚拟的,并不会从任何地方扣除。

info

请注意,只有在本地开发环境中,才能使用 dfx ledger fabricate-cycles 命令。

它的基本用法如下:

dfx ledger fabricate-cycles [options]

常用的参数和选项有:

  • --all
    用来向 dfx.json 文件中所配置的所有容器充值 cycles。
  • --canister <canister name/id>
    指定要接收 cycles 的容器名称或 ID。您必须指定容器名称或 提供 –all 选项。
  • --amount <amount>
    用来指定要铸造成 cycles 的 ICP 数量,最多可以指定八位小数的数字。可以理解为 --amount--icp--e8s 的结合。
  • --icp <icp>
    指定 ICP 为整数,可以单独使用或与 --e8s 结合使用。
  • --e8s <e8s>
    指定 e8s 为整数。e8 是 ICP 的最小单位,例如 1.050000001ICP5000000e8s 的组合。它可以单独使用或与 --icp 结合使用。
  • --cycles <cycles>
    用来指定您要制造的 cycles 数量。
  • --t <trillion cycles>
    用来指定您要制造的 cycles 数量,以 T 来计算。

下面是一个示例:

dfx ledger fabricate-cycles --all --cycles 8000000000000

该命令会向工程 dfx.json 文件中所配置的容器全部充值 8T 的 cycles,并输入如下所示的信息:

Fabricating 8000000000000 cycles onto hello_backend
Fabricated 8000000000000 cycles, updated balance: 11_899_662_119_932 cycles
info

dfx ledger fabricate-cycles 另外一个常见的用处是向本地开发环境的钱包充值 cycles。请参考如下示例:

$ dfx identity get-wallet
bnz7o-iuaaa-aaaaa-qaaaa-cai

$ dfx wallet balance
90.699 TC (trillion cycles).

$ dfx ledger fabricate-cycles --canister bnz7o-iuaaa-aaaaa-qaaaa-cai --t 100
Fabricating 100000000000000 cycles onto bnz7o-iuaaa-aaaaa-qaaaa-cai
Fabricated 100000000000000 cycles, updated balance: 190_699_334_378_341 cycles

我们需要执行该命令的原因是,本地环境部署容器也会消耗本地钱包的 cycles。当本地钱包 cycles 余额不足,您会得到如下类似的返回信息:

$ dfx deploy
Deploying all canisters.
Creating canisters...
Creating canister greet_backend...
Error: Failed while trying to deploy canisters.
Caused by: Failed while trying to deploy canisters.
Failed while trying to register all canisters.
Failed to create canister 'greet_backend'.
The replica returned a replica error: Replica Error: reject code CanisterError, reject message Canister bnz7o-iuaaa-aaaaa-qaaaa-cai is out of cycles: requested 3_100_000_000_000 cycles but the available balance is 797_770_504_197 cycles and the freezing threshold 173_237_730 cycles, error code None

此时您就需要调用 dfx ledger fabricate-cycles 来为您的本地钱包充值 cycles,从而继续本地开发。

创建容器

您可以使用 dfx ledger create-canister 命令来在 IC 上创建容器、并充值价值为指定 ICP 的 cycles。 它的基本用法如下:

dfx ledger create-canister <controller> [options]  [flag] --network ic

它常用的参数和转账很相似,比如:--amount, --icp, --e8s, --fee 等。不同之处在于:

  • <controller>
    用来指定新创建容器的控制者

  • --subnet-type <subnet-type> 用来指定子网类型。如果没有指定,容器会被创建在随机的默认应用子网上。
    目前支持的类型是 fiduciary,请参考论坛文章获取详细信息。

下面是一个示例:

dfx ledger create-canister tsqwz-udeik-5migd-ehrev-pvoqv-szx2g-akh5s-fkyqc-zy6q7-snav6-uqe --amount 1.25 --network ic

它在 IC 主网上创建一个容器,将指定的主体设置为容器的控制者,并向充值价值为 1.25 ICP 的 cycles。如果创建成功会返回类似如下所示信息:

Transfer sent at BlockHeight: 20
Canister created with id: "53zcu-tiaaa-aaaaa-qaaba-cai"

以上就是 dfx ledger 命令的基本用法,未列举部分请参考官方文档

钱包 (Wallet)

容器需要 cycles 来执行操作、并为所使用的资源付费,用户和开发人员通过一种称为 cycles 钱包的特殊容器来管理 cycles 的分配和所有权。

目前 cycles 钱包是一种复杂的解决方案,它本质上是一个容器、自身也会消耗 cycles。如果对应的容器 ID 在迁移过程中遗失,则会丢失 cycles。所以目前 DFINITY 基金会在开发的一个新功能就是 cycles 账本,用来简化 cycles 的管理。Cycles 账本将作为单个全局账本容器来部署,它将符合 ICRC-2 标准,并且还将与 NNS 容器、用户容器交互,以提供账本特定功能,例如可以使用 cycles 创建新容器、向容器发送 cycles 和接受转入的 cycles。更多关于 cycles 账本的信息请参考这里

因为 cycles 账本预计近期将会推出,这里关于 cycles 钱包我们只做简单介绍。

创建钱包

常用的创建钱包的方式有两种:一种是通过兑换 cycles 优惠券来自动创建;一种是通过创建容器、并安装钱包的 Wasm 代码。

自动创建

请参考如何获得免费 cycles 文档。

其中如下的命令行会帮助您创建一个 cycles 钱包。

dfx wallet --network ic redeem-faucet-coupon <your-coupon-code>

您可以通过以下命令来查看您的钱包余额。

dfx wallet balance --network ic

手动创建

按照以下步骤,您可以手动创建 cycles 钱包:

  • 通过 dfx ledger create-canister 创建一个新的容器,请参考这里

  • 通过 dfx identity deploy-wallet 在容器里安装钱包 Wasm 代码,请参考这里

  • 通过 dfx identity get-wallet 来查看跟当前身份关联的 cycles 钱包,请参考这里

获取余额

dfx wallet balance 命令返回与当前 cycles 钱包的余额。

下面是一个示例:

dfx wallet balance --network ic

它返回当前 cycles 钱包的余额,类似如下:

15.292 TC (trillion cycles)

转账

您可以通过 dfx wallet send 将 cycles 从 cycles 钱包发送到另一个容器。它的基本用法如下:

dfx wallet send [flag] <destination> <amount> --network <network>

常用的参数和选项有:

  • <destination>
    用来指定您要转账的容器 ID。
  • --amount <amount>
    用来指定要转账的 cycles 数量。

下面是一个示例:

dfx wallet send r7inp-6aaaa-aaaaa-aaabq-cai 2000000000

它将会从跟当前身份相关联的 cycles 钱包发送 2000000000 个 cycles 到指定的容器。

以上就是 dfx wallet 命令的基本用法,未列举部分请参考官方文档

容器 (Canister)

您可以使用 dfx canister 命令来和 IC 或者本地的容器执行环境交互。大多数情况,你可以通过 dfx canister 命令来管理容器的生命周期、执行一些任务(比如调用容器方法)。

它的基本用法如下:

dfx canister <subcommand> [flags]

创建

dfx canister create 可以用来创建一个新的容器。它的基本用法如下:

dfx canister create [option] [flag] [--all | canister_name]

常用的参数和选项有:

  • --controller <principal>
    用来指定新创建的容器的控制者
  • -with-cycles <number-of-cycles>
    用来指定要充值的 cycles 数量,该数量会从 cycles 钱包里面扣除。
  • --specified-id <principal>
    用来指定所创建的容器的 ID。
  • <canister_name>
    用来指定所创建的容器名字,该容器名字必须在项目的 dfx.json 文件中已经存在。
  • --all
    如果没有指定所创建的容器名字,而是提供了 --all 参数,则会创建所有在 dfx.json 中已经配置的容器。

这里并未一一列举 dfx canister create 所有的参数,如需了解请参考官方文档

下面是一个示例:

dfx canister create --with-cycles 8000000000000 --all

该命令会创建所有 dfx.json 中配置的容器,并指定初始 cylces 数量为 8000000000000。

dfx ledger create-canister 通过 ICP 来创建容器不同,虽然两者都能创建容器,但 dfx canister create 通过 cycles 钱包转入 cycles,并且提供了更精细的控制,比如可以指定 memory、compute 分配的大小。

删除

dfx canister delete 可以用来删除容器,并将剩余的 cycles 转出到您的 cycles 钱包。它的基本用法如下:

dfx canister delete [flag] [--all | canister_name]

常用的参数和选项有:

  • <canister_name>
    用来指定所创建的容器名字或 ID。
  • --all
    如果没有指定所创建的容器名字,而是提供了 --all 参数,则会创建所有在 dfx.json 中已经配置的容器。

需要注意的是,dfx canister delete 必须要在一个 dfx 工程的目录下运行。

如果您已经没有本地工程环境,可以尝试以下示例从 IC 主网删除一个容器:

  1. 执行 mkdir dfx_deleting 创建 dfx_deleting 目录;
  2. 执行 cd dfx_deleting 进入该目录;
  3. 执行 echo '{}' > dfx.json 生成一个空的 dfx.json 文件;
  4. 执行 dfx canister delete <canister_id> --network ic 通过容器 ID 来删除给定的容器。

您可以在运行该示例前、后调用 dfx wallet balance --network ic 来查看 cycles 余额变化。

充值 cycles

dfx canister deposit-cycles 命令可以用来从 cycles 钱包给指定容器充值 cycles。它的基本用法如下:

dfx canister deposit-cycles [amount of cycles] [--all | canister_name]

常用的参数和选项有:

  • <canister_name>
    用来指定所需充值的容器名字或 ID。
  • --all
    如果没有指定所需充值的容器名字,而是提供了 --all 参数,则会充值所有在 dfx.json 中已经配置的容器。

下面是一个示例:

dfx canister deposit-cycles 2000000000000 --all

该命令会给所有 dfx.json 中配置的容器充值数量为 2000000000000 的 cylces。

查看容器 ID

dfx canister id 命令可以用来查看指定容器的 ID。它的基本用法如下:

dfx canister id <canister-name>

下面是一个示例:

dfx canister id hello_world --network ic

查看容器信息

dfx canister info 命令可以用来查看指定容器的信息。它的基本用法如下:

dfx canister info <canister-id>

下面是一个示例:

dfx canister info rrkah-fqaaa-aaaaa-aaaaq-cai --network ic

该命令会输出 nns governance 容器的相关信息如下:

Controllers: r7inp-6aaaa-aaaaa-aaabq-cai
Module hash: 0x3eadce8399b6bc9450bfb8bb54adefc1e27b2564146684d4c6d41a62c4110b73

查看容器日志

dfx canister logs 命令可以显示容器的日志。它的基本用法如下:

dfx canister logs <canister-name>

下面是一个示例,显示来自 hello_world 容器的日志。

dfx canister logs hello_world

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

[0. 2024-06-04T21:14:25.882276Z]: Some text message
[1. 2024-06-04T21:18:18.094003Z]: (bytes) 0xc0ffee

容器快照

当容器因未按预期工作、陷入陷阱等原因需要回滚到之前的版本,开发人员可以使用容器快照。一个容器包含编译后的 Wasm 代码和数据(例如容器 ID、配置和 Wasm 内存等),开发人员可以对已停止的容器进行快照,以保存当前的稳定内存、堆内存、数据和 Wasm 模块等信息。该快照可以在后期进行加载、以将容器回滚到快照中所保存的状态。

创建快照

dfx canister snapshot create 命令可以用来为已停止状态的容器创建快照。它的基本用法如下:

dfx canister snapshot create <canister> [--replace <replace>]

常用的参数和选项有:

  • <canister>
    用来指定容器名字或 ID。
  • --replace <replace>
    如果提供了快照 ID,当前快照将替换它并重用该 ID。

以下是一个示例:

dfx canister stop hello
dfx canister snapshot create hello
dfx canister start hello

加载快照

dfx canister snapshot load 命令可以用来加载之前通过 dfx canister snapshot create 命令创建的容器快照。它的基本用法如下:

dfx canister snapshot load <canister> <snapshot>

常用的参数和选项有:

  • <canister>
    用来指定容器名字或 ID。
  • <snapshot>
    用来指定需要加载的快照 ID。

以下是一个示例:

dfx canister stop hello
dfx canister snapshot load hello 1a2b3c4d
dfx canister start hello

删除快照

dfx canister snapshot delete 命令可以用来删除之前通过 dfx canister snapshot create 命令创建的容器快照。它的基本用法如下:

dfx canister snapshot delete <canister> <snapshot>

常用的参数和选项有:

  • <canister>
    用来指定容器名字或 ID。
  • <snapshot>
    用来指定需要加载的快照 ID。

以下是一个示例:

dfx canister snapshot load hello 1a2b3c4d

列举快照

dfx canister snapshot list 命令可以用来列举之前通过 dfx canister snapshot create 命令创建的容器快照。它的基本用法如下:

dfx canister snapshot list <canister>

常用的参数和选项有:

  • <canister>
    用来指定容器名字或 ID。

以下是一个示例:

dfx canister snapshot list hello

安装容器代码

dfx canister install 命令可以用来安装容器代码。它的基本用法如下:

dfx canister install [flag] [option] [--all | canister_name]

常用的参数和选项有:

  • <canister_name>
    用来指定所需安装代码的容器名字或 ID。
  • --all
    如果没有指定所需安装代码的容器名字,而是提供了 --all 参数,则会安装所有在 dfx.json 中已经配置的容器。
  • --wasm <file.wasm>
    用来指定所需安装的 Wasm 代码文件。如果这里指定了,dfx.json 中配置的则会被忽略。

这里并未一一列举 dfx canister install 所有的参数,如需了解请参考官方文档

更新容器设置

dfx canister update-settings 命令可以用来更改容器设置。它的基本用法如下:

dfx canister update-settings [flags] [options] [canister_name | --all]

常用的参数和选项有:

  • <canister_name>
    用来指定所需更新的容器名字或 ID。
  • --all
    如果没有指定所需更新的容器名字,而是提供了 --all 参数,则会更新所有在 dfx.json 中已经配置的容器。
  • --add-controller <principal> 给指定容器添加控制者。
  • --remove-controller <principal> 删除指定容器的控制者。

这里并未一一列举 dfx canister update-settings 所有的参数,如需了解请参考官方文档

下面是一个示例:

dfx canister update-settings --add-controller <principal-id> <canister-id> --network=ic

该命令会给指定的容器添加一个新的控制者。

调用容器方法

dfx canister call 命令可以调用容器上的方法。它的基本用法如下:

dfx canister call [option] <canister_name> <method_name> [argument] [flag]

常用的参数和选项有:

  • canister_name
    用来指定所调用的容器名字或 ID。
  • method_name
    用来指定所调用的方法名字。
  • argument 给指定所调用方法的参数。

下面是一个示例:

dfx canister call qvhir-riaaa-aaaan-qekqa-cai greet --network ic

该命令会给调用 qvhir-riaaa-aaaan-qekqa-cai greet 容器上的 greet 方法。

这里并未一一列举 dfx canister call 所有的参数,如需了解请参考官方文档

以上就是 dfx canister 命令的基本用法,未列举部分请参考官方文档

开发相关命令

启动

您可以使用 dfx start 命令启动本地容器执行环境和 Web 服务器进程。这样您可以通过 dfx deploy 命令将容器代码部署到本地容器执行环境,进而在开发过程中测试您的 dapp。

默认情况下,所有本地 dfx 工程都将共同使用一个本地容器执行环境,您可以从任何目录运行 dfx startdfx stop

该命令的基本用法如下:

dfx start [option] [flag]

该命令的参数和选项较多,常用的如下:

  • --background
    在后台启动本地容器执行环境和 Web 服务器进程,并等待回复后才返回到命令行。
  • --clean
    在启动本地容器执行环境和 Web 服务器进程时,清除项目缓存中的检查点。您可以使用此选项将项目缓存设置为新状态,进行调试或者故障排除。
  • --host <host>
    指定主机接口 IP 地址和端口号以绑定前端。

下面是一个示例:

dfx start

该命令会在当前命令行中启动本地容器执行环境和 Web 服务器进程,您需要打开一个新的命令行来运行其他命令。

您可以使用以下命令来在后台运行一个本地容器执行环境:

dfx start --background

停止

您可以使用 dfx stop 命令停止当前在计算机上运行的本地容器执行环境。为了模拟与 IC 的连接,本地容器执行环境会在启动它们的终端中或后台持续运行,所以需要手动停止。

该命令的基本用法如下:

dfx stop [flag]

该命令的用法比较简单,除了通用的一些参数,并没有提供特定的参数。运行以下命令就会停止您的本地容器执行环境。

dfx stop

创建

您可以使用 dfx new 命令创建一个新的 IC 工程。该命令会创建一个默认的项目结构,其中包含了一个 dapp 的模板,您可以用来作为基础进而修改成为您所需要的 dapp。它的基本用法如下:

dfx new <project_name> [flag]

常用的参数和选项有:

  • project_name
    用来指定所创建的工程名称。
  • --type 用来指定所创建工程的类型,可以选择 rust 或 motoko。默认值为 motoko。
  • --no-frontend
    用来跳过安装前端模板代码,创建仅包括一个 .txt 文件的 Asset 容器。如果没有指定该选项,并检测到您的计算机上未安装 node.js,则会以 --no-frontend 为默认行为执行。
  • --frontend
    用来安装前端模板代码。如果没有指定该选项,并检测到您的计算机上已安装 node.js,则会以 --frontend 为默认行为执行。如果您的计算机上当前未安装 node.js,而您指定了 --frontend 选项,则会在创建项目时尝试安装 node.js。

下面是一个示例:

dfx new my_test_project

该命令将创建一个名为 my_test_project 的新工程,该工程包括默认项目目录结构和项目的 Git 存储仓库。

您可以用带有 --dry-run 的命令来预览将要创建的文件。

dfx new my_test_project --dry-run

构建

您可以使用 dfx build 命令将程序编译为可在 IC 上部署的 WebAssembly 模块。该命令会编译工程的 dfx.json 配置文件中所定义的程序,并使用该配置文件中 canisters 部分所配置的信息查找要编译的源代码。

请注意,您只能在工程目录下运行此命令。例如,如果您的项目名称是 hello_world,则您的当前工作目录必须是 hello_world 目录或其任一子目录。

该命令的基本用法如下:

dfx build [flag] [option] [--all | canister_name]

常用的参数和选项有:

  • --network <network>
    指定您要连接的网络别名或 URL。您可以使用此选项覆盖 dfx.json 配置文件中指定的网络。
  • --all
    构建项目 dfx.json 文件中配置的所有容器,它是 dfx build 的默认选项。
  • canister_name
    指定您需要构建的容器名称。如果您仅仅想构建某一个容器,请在不使用 --all 选项的同时提供一个容器名称作为参数。请注意,该容器名称必须与 dfx.json 的 canisters 部分中的某一个容器名称匹配。

下面是一个 dfx.json 的示例。

{
"canisters": {
"hello_world: {
"main": "src/hello_world/main.mo",
"type": "motoko"
},
"hello_world_assets": {
"dependencies": [
"hello_world"
],
"frontend": {
"entrypoint": "src/hello_world_assets/public/index.js"
},
"source": [
"src/hello_world_assets/assets",
"dist/hello_world_assets/"
],
"type": "assets"
}
},
"defaults": {
"build": {
"packtool": ""
}
},
"version": 1
}

执行以下命令会构建 hello_worldhello_world_assets 这两个容器。

dfx build

如果您只想构建后端容器 hello_world ,可以运行如下命令:

dfx build hello_world

部署

您可以使用 dfx deploy 命令注册、构建和部署 dapp。通过提供不同的参数,您可以在本地容器执行环境、IC 主网 或指定的测试网络上执行该命令。默认情况下,该命令将部署工程 dfx.json 配置文件中定义的所有容器。

该命令等价于以下命令集,使得您能够运行一个命令来简化开发流程:

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

dfx build 一样,您只能在工程目录下运行此命令。

该命令的基本用法如下:

dfx deploy [flag] [option] [canister_name]

常用的参数和选项有:

  • --network <network>
    指定您要连接的网络别名或 URL。默认使用本地容器执行环境。
  • --ic
    --network ic 的别名。
  • --argument <argument>
    指定使用 Candid 语法在部署期间向容器传递参数。
  • --with-cycles <number-of-cycles>
    可以指定工程中容器的初始 cycles 数量。
  • canister_name
    指定您需要部署的容器名称。请注意,该容器名称必须与 dfx.json 的 canisters 部分中的某一个容器名称匹配。

下面是一个示例:

dfx deploy --with-cycles 8000000000000 --network ic

该命令会将 dfx.json 中所定义的容器部署到 IC 主网,每个容器都包含初始 8000000000000 cycles 数量。

依赖

您可以使用 dfx deps 命令从 IC 主网获取所依赖的容器、并在本地部署。您只能在工程目录下运行此命令。

该命令的基本用法如下:

dfx deps [subcommand] [options]

该命令有三个子命令:

  1. pull: 拉取项目所依赖的容器;
  2. init:为依赖容器设置初始化参数;
  3. deploy:部署依赖容器。

分别介绍如下。

拉取

您可以使用 dfx deps pull 子命令来拉取在 dfx.json 中定义的依赖容器,该命令会自动拉取所有的间接依赖。

该命令的基本用法如下:

dfx deps pull [options]

常用的参数和选项有:

  • --network <network>
    指定您要连接的网络别名,默认使用 IC 主网。

下面是一个示例:

dfx deps pull

当执行成功后,您可以到项目的 deps/pulled.json 文件查看具体依赖信息。

初始化

您可以使用 dfx deps init 命令为依赖容器设置初始化参数。

该命令的基本用法如下:

dfx deps init [options] [canister]

当执行成功后,您可以到项目的 deps/init.json 文件查看具体初始化信息。

默认情况下,该命令会从 deps/pulled.json 读取 init_arg 参数并保存至 deps/init.json 文件。

如果有任何依赖容器缺少初始化参数,上述命令会提示它们的 canister ID。然后,您可以指定 canister ID 单个依赖容器设置初始化参数。

dfx deps init <CANISTER> --argument <ARGUMENT> [--argument-type <TYPE>]

以下是一些示例。

  1. 下面的命令将数字 1 作为容器 dep_a 的初始化参数,参数类型是默认的 Candid 类型。

    dfx deps init dep_a --argument 1
  2. 下面的命令将十六进制编码的原始字节作为容器 dep_b 的初始化参数。

    dfx deps init dep_b --argument "4449444c00017103616263" --argument-type raw
  3. 下面的命令将文件 init_c.txt 的内容作为容器 dep_c 的初始化参数。

    dfx deps init dep_c --argument-file init_c.txt
info

请注意,即使您依赖的容器不需要初始化参数,您仍需要执行 dfx deps init 以生成 deps/init.json 文件。dfx deps deploy 命令会检查该文件。

部署

您可以使用 dfx deps deploy 命令为部署所有依赖容器。

该命令的基本用法如下:

dfx deps deploy [options] [canister]

下面是一个示例:

dfx deps deploy

该命令会在本地副本上部署所有依赖容器,如果某些依赖容器尚未被拉取、或未设置初始化参数,该命令将失败。您可以根据错误信息来进行修复。

其他

帮助

您可以使用 dfx help 命令来查看 dfx 及其子命令的使用方法。它的基本用法如下:

dfx help [subcommand]

常用的参数有:

  • subcommand
    用来指定您想要查看的子命令。

下面是一个示例,用来查看 dfx 命令的用法。

dfx help

而下面的命令则可以查看子命令 new 的具体用法。

dfx help new

升级

您可以使用 dfx upgrade 命令升级在本地计算机上运行的 SDK 组件。此命令会检查您当前安装的 SDK 版本与 manifest.json 文件中指定的最新公开版本之间的差异。如果在本地检测到旧版本的 SDK,则 dfx upgrade 命令会自动从 CDN 获取最新版本。

它的基本用法如下:

dfx upgrade [flag] [option]

常用的参数有:

  • --current-version <version>
    用来指定当前版本。如果设置了该选项,您指定的版本将会作为本地当前版本与 manifest.json 文件中的最新版本进行比较。

下面是一个示例,用来更新您的 SDK 版本。

dfx upgrade

ping

使用 dfx ping 命令可以检查与 IC 主网或测试网络的连接。

请注意:

  • 如果要测试与本地服务器的连接,您只能从工程目录下运行此命令。
  • 如果您要测试与 IC 主网的连接,您可以从任何目录运行 dfx ping ic 命令。

它的基本用法如下:

dfx ping [provider] [flag]

常用的参数有:

  • provider
    用来指定需要测试的网络。

下面是一个示例,用来测试与 IC 主网的连接。

dfx ping ic

总结

除了本文列举的关于身份、账本、cycles 钱包、容器以及开发相关的命令,dfx 命令还有更多的子命令,目前就不在一一列举,后续如果有需要可以根据大家反馈继续增加,也欢迎大家参与贡献。

有问题么?

欢迎大家随时向我们提出任何技术问题。我们会尽力尽快回应

  1. 上网比较方便的,在 ICP China 的 Twitter Community,用中文发帖提问

  2. 有经验的开发者在 DFINITY 基金会运营的开发者论坛上用英文提问

    info

    https://forum.dfinity.org/ ,可以 cue 我们:BenPaulVincentHerbert

  3. 深度 ICP 用户可以在 OpenChat 上的 IC123.xyz Community 里的频道 ic123.xyz 工作组 里提问题

    欢迎您申请 DFINITY 基金会的 Developer Grant 项目,加入互联网计算机的大家庭!