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.05000000
是1
个ICP
和5000000
个e8s
的组合。它可以单独使用或与--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 都是虚拟的,并不会从任何地方扣除。
请注意,只有在本地开发环境中,才能使用 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.05000000
是1
个ICP
和5000000
个e8s
的组合。它可以单独使用或与--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
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 主网删除一个容器:
- 执行
mkdir dfx_deleting
创建dfx_deleting
目录; - 执行
cd dfx_deleting
进入该目录; - 执行
echo '{}' > dfx.json
生成一个空的dfx.json
文件; - 执行
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 start
和 dfx 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_world
和 hello_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]
该命令有三个子命令:
pull
: 拉取项目所依赖的容器;init
:为依赖容器设置初始化参数;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
作为容器dep_a
的初始化参数,参数类型是默认的 Candid 类型。dfx deps init dep_a --argument 1
下面的命令将十六进制编码的原始字节作为容器
dep_b
的初始化参数。dfx deps init dep_b --argument "4449444c00017103616263" --argument-type raw
下面的命令将文件
init_c.txt
的内容作为容器dep_c
的初始化参数。dfx deps init dep_c --argument-file init_c.txt
请注意,即使您依赖的容器不需要初始化参数,您仍需要执行 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
命令还有更多的子命令,目前就不在一一列举,后续如果有需要可以根据大家反馈继续增加,也欢迎大家参与贡献。
有问题么?
欢迎大家随时向我们提出任何技术问题。我们会尽力尽快回应。
上网比较方便的,在
ICP China
的 Twitter Community,用中文发帖提问有经验的开发者在 DFINITY 基金会运营的开发者论坛上用英文提问
infohttps://forum.dfinity.org/ ,可以 cue 我们:Ben,Paul,Vincent ,Herbert。
深度 ICP 用户可以在 OpenChat 上的
IC123.xyz Community
里的频道ic123.xyz 工作组
里提问题欢迎您申请 DFINITY 基金会的 Developer Grant 项目,加入互联网计算机的大家庭!