完全指南:Sway 智能合约的构建、测试与项目编排工具链)
ForcFuel Orchestrator完全指南Sway 智能合约的构建、测试与项目编排工具链【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/swayForcFuel Orchestrator是 Sway 语言与 Fuel 生态的核心 CLI 工具链负责项目的脚手架搭建、依赖解析、编译构建、格式化、脚本执行、合约部署与测试等全流程工作。如果你有 Rust 背景可以把它直接类比为 Sway 世界的cargo。本文以本仓库forc/README.md为骨架结合forc/src/cli/mod.rs的命令实现、docs/book/src/forc/的官方参考文档与仓库内真实示例项目系统讲解 Forc 的安装形态、命令体系、Forc.toml清单文件、依赖管理、Workspace 与插件扩展机制帮助你从零掌握 Sway 项目的完整开发闭环。Forc 是什么Fuel 生态的cargoForc 的全称是Fuel Orchestrator。它面向使用 Fuel 区块链的开发者提供了一系列用于 Sway 开发的工具与命令覆盖脚手架新项目scaffolding a new project格式化代码formatting运行脚本running scripts部署合约deploying contracts测试合约testing contracts。这一设计哲学在官方 Sway Book 的 Forc 章节 中有完整描述forc之于 Sway正如cargo之于 Rust。官方完整命令参考见仓库内的 Commands 章节。从实现层面看Forc 是一个用 Rust 编写、基于clap构建的命令行程序。其二进制入口在forc/src/main.rsuse forc_util::ForcCliResult; #[tokio::main] async fn main() - ForcCliResult() { forc::cli::run_cli().await.into() }真正的命令分派发生在forc/src/cli/mod.rs的run_cli()函数中程序先解析全局参数--verbose、--silent、--log-level再根据子命令调用对应的exec函数。forc自身还内置了日志与 tracing 初始化init_tracing_subscriber因此你可以在所有子命令上使用统一的-v可叠加、-s和-L LEVEL全局选项控制输出粒度。在forc/Cargo.toml中可以看到它的依赖全景forc-pkg包管理、forc-test测试执行、sway-core编译器核心、sway-ir中间表示、sway-error诊断等印证了 Forc 并不仅仅是一个壳而是把编译、测试、包解析等能力组装起来的总调度器。Forc 的完整命令体系Forc 的命令注册在forc/src/cli/mod.rs的Forc枚举中当前仓库支持以下 16 个原生命令命令作用可见别名forc add添加依赖path / git / ipfs / registry / contract-dep—forc addr2line将字节码地址映射回源码位置—forc build编译 Sway 项目bforc check仅做类型检查不生成字节码—forc clean清理构建产物—forc completions生成 shell 补全脚本—forc init在已有目录中初始化项目—forc new创建新项目—forc parse-bytecode解析并解释字节码—forc plugins列出已安装的插件—forc remove移除依赖—forc template基于模板创建新项目tforc test编译并运行测试—forc update更新依赖及Forc.lock—forc contract-id计算合约 ID—forc predicate-root计算 predicate 根—这些命令的实现分散在forc/src/ops/目录中如forc_build.rs、forc_check.rs、forc_clean.rs、forc_init.rs、forc_template.rs等而每个命令的参数定义则位于forc/src/cli/commands/。各命令的官方用法说明可参见仓库文档 Commands 章节 下的独立页面例如forc newforc initforc buildforc templateforc testforc update此外Forc枚举中还有一个Plugin(VecString)变体充当未知子命令的兜底入口当用户输入一个 Forc 不认识的子命令时Forc 会尝试查找名为forc-子命令的可执行文件并转发参数详见下文插件机制。从零开始创建、初始化和构建一个 Sway 项目创建新项目forc newforc new用于在一个新目录中脚手架一个 Sway 项目等价于 Rust 的cargo new。它会在目标目录生成project-name/ ├── Forc.toml # 项目清单文件 ├── Forc.lock # 依赖锁定文件首次构建后生成 └── src/ └── main.sw # 默认入口文件仓库内的examples/目录就是这一命令的产物模板例如 examples/counter/Forc.toml 定义了名为counter的合约项目其 src/main.sw 是标准的合约源码。如果你需要创建Workspace多包工作区可加--workspace参数。在已有目录初始化forc initforc init与forc new的区别在于前者在当前已存在的目录中初始化项目结构同样支持--workspace适合把已有代码纳入 Forc 管理后者总是新建目录。两者生成的Forc.toml结构完全一致。编译项目forc buildforc build是日常开发最常用的命令它将 Sway 源码编译为目标字节码$ forc build默认使用debug构建配置build profile产物输出到out/debug/目录加--release则使用release配置。官方文档 forc build 页面对各选项有详细说明。构建过程会经历解析 → 类型检查 → IR 生成 → 汇编 → 字节码的完整流水线。forc check则只执行到类型检查阶段用于快速验证代码正确性而不产出字节码适合 CI 或编辑器内联诊断。仓库内可以找到大量真实构建示例例如 examples/fizzbuzz、examples/storage_map 等 40 余个可直接forc build验证的示例项目forc-test的 test_data 目录则演示了 contract / library / predicate / script 四种程序类型的测试工程结构。Forc.toml 清单文件全解Manifest ReferenceForc.toml是每个 Sway 包必须存在的清单文件采用 TOML 格式等价于 Rust 的Cargo.toml。官方完整参考见 Manifest Reference。它由以下几大部分组成[project]—— 定义 Sway 项目[dependencies]—— 定义依赖[network]—— 定义 Forc 交互的网络[build-profile.*]—— 定义构建配置[patch]—— 定义依赖补丁覆盖[contract-dependencies]—— 定义合约依赖。[project]段项目元信息[project]段可声明的字段如下除name外大多可选字段含义默认值/说明name项目名必填version项目版本可选description项目描述可选authors作者列表可选organization所属组织可选license项目许可证可选homepage项目主页 URL可选repository源码仓库 URL可选documentation文档 URL可选categories项目分类可选keywords项目关键词可选entry编译器解析的入口文件默认main.swimplicit-std是否隐式引入与当前 forc 版本配套的std默认true非必要不建议改动forc-version项目正常运行所需的最低 forc 版本可选metadata供外部工具存放配置的元数据区可选experimental编译期启用的实验特性开关可选一个完整的[project]示例摘录自 Manifest Reference[project] authors [user] entry main.sw description Wallet contract version 1.0.0 homepage https://example.com/ repository https://example.com/ documentation https://example.com/ organization Fuel_Labs license Apache-2.0 name wallet_contract categories [example] keywords [example] experimental { some_feature true, some_other_feature false }仓库内真实示例可对照 examples/wallet_abi/Forc.toml 与 examples/advanced_storage_variables/Forc.toml 等文件。关于[project.metadata]该段为外部工具与插件预留了在Forc.toml中存储自身配置的空间。要点包括metadata 的键名是任意的不必与工具名一致Forc本身不会解析 metadata 的内容解析由插件开发者自行完成metadata 可定义在 workspace 级[workspace.metadata]与项目级[project.metadata.any_name_here]两个层面项目级优先常见用途文档生成设置、格式化器配置、调试器选项、钱包集成、合约索引、测试框架等。例如一个索引工具的配置可以这样写[project.metadata.indexing] namespace counter-contract schema_path out/release/counter-contract-abi.json[dependencies]段依赖声明依赖可基于以下来源声明详见 Dependencies 与 Manifest Reference 的[dependencies]段字段含义version期望的依赖版本namespace与 registry 源关联的命名空间可选path本地依赖路径git托管依赖的 git 仓库 URLbranch从 git 仓库拉取的指定分支tag拉取的指定 tagrev拉取的指定 commitrev引用对应Forc.toml中的写法[dependencies] custom_lib { path ../custom_lib } # 本地路径 custom_lib { ipfs QmYwAPJzv5CZsnA... } # IPFS 源 custom_lib { git https://github.com/..., branch master } # git 源 custom_lib 0.0.1 # registry 源forc.pub注意当前 Forc 尚不支持离线模式下使用 registry 源也暂不支持通配符声明如custom_lib *和 caret 声明如custom_lib ^0.1的语义。[network]段默认值为url http://127.0.0.1:4000即本地 Fuel 节点的默认地址部署类操作如forc deploy默认连接该地址。[build-profile.*]段构建配置[build-profile]表用于定制编译器的行为如调试输出。每个 manifest 都隐式内置debug与release两个 profile默认使用debug传--release切换为release。可配置字段如下字段含义默认值print-ast是否打印生成的 ASTfalseprint-dca-graph是否打印死代码分析DCA图GraphViz DOT 格式falseprint-dca-graph-url-formatDOT 文件中使用的 URL 格式如 VS Code 可写vscode://file/{path}:{line}:{col}—print-ir是否打印生成的 Sway IRfalseprint-asm是否打印生成的汇编falseterse精简模式限制警告与错误输出falsetime-phases输出编译各阶段耗时falseinclude-tests是否在解析/类型检查/代码生成中包含测试函数forc test会置为 truefalseerror-on-warnings是否将警告视为错误falsebacktracepanic回溯中包含的 panic 函数集合取值为all、all_except_never、only_always、nonedebug 默认all_except_neverrelease 默认only_always覆盖示例摘录自 Manifest Reference[project] authors [user] entry main.sw organization Fuel_Labs license Apache-2.0 name wallet_contract [build-profile.debug] print-asm { virtual false, allocated false, final true } print-ir { initial false, final true, modified false, passes []} terse false [build-profile.release] print-asm { virtual true, allocated false, final true } print-ir { initial true, final false, modified true, passes [dce, sroa]} terse true若要使用自定义 profile可在相关命令上传--build-profile profile name。需要注意的是显式传入的 CLI 选项如--asm all会覆盖所选 build-profile 中对应的设置。[patch]段依赖覆盖[patch]用于将依赖图中某个依赖替换为其他副本适合测试本地改动、使用未发布特性或调试依赖。核心规则有两条引号必须加[patch]后的每个键都必须加引号如[patch.forc.pub]因为其中的特殊字符如点号若不加引号会被 TOML 解析为嵌套表源必须匹配git 补丁只能替换 git 依赖registry 补丁只能替换 registry 依赖。git 依赖补丁示例[project] authors [user] entry main.sw organization Fuel_Labs license Apache-2.0 name wallet_contract [dependencies] [patch.https://github.com/fuellabs/sway] std { git https://github.com/fuellabs/sway, branch test }registry 依赖补丁示例把 registry 版std换成本地路径版[project] authors [user] entry main.sw license Apache-2.0 name my_contract [dependencies] std 0.70.1 [patch.forc.pub] std { path ../sway/sway-lib-std }[contract-dependencies]段合约依赖[contract-dependencies]表用于声明合约或脚本可能交互的合约集合。与普通[dependencies]的区别在于合约依赖会被构建并固定pin下来但不会导入其整个公共命名空间而是把各自的合约 ID 以CONTRACT_ID常量形式暴露在合约依赖包的命名空间根部从而免去每次重新部署时手动更新 ID 的麻烦。声明方式与[dependencies]相同可指向path或git源但必须指向合约否则会报错[project] authors [user] entry main.sw organization Fuel_Labs license Apache-2.0 name wallet_contract [contract-dependencies] foo { path ../foo }在 Sway 源码中的使用方式script; fn main() { let foo_id foo::CONTRACT_ID; }由于合约 ID 由确定性计算得出相同的合约内容会得到相同的 ID而链上不允许部署两个相同 ID 的合约因此合约依赖支持salt参数来修改最终 ID[contract-dependencies] foo { path ../foo, salt 0x1000000000000000000000000000000000000000000000000000000000000000 }未显式指定salt时隐式采用全零值。依赖管理forc add / remove / updateForc 内置了与cargo类似的依赖管理能力可从git、ipfs、本地path和社区registryforc.pub拉取包。官方文档见 Dependencies。添加依赖forc addforc add dep [--path PATH] [--git URL --tag TAG] [--ipfs CID] [--contract-dep]常用示例# 从 git 分支添加 forc add custom_lib --git https://github.com/FuelLabs/custom_lib --branch master # 从本地路径添加 forc add custom_lib --path ../custom_lib # 从 IPFS 添加 forc add custom_lib --ipfs QmYwAPJzv5CZsnA... # 从 registryforc.pub添加 forc add custom_lib0.0.1 # 作为合约依赖添加 forc add my_contract --git https://github.com/example/contract --contract-dep可选参数还包括--salt HEX自定义合约 salt、--package NAME定位 workspace 中的特定包、--manifest-path PATH指定 manifest 文件路径。添加完成后运行forc build会自动抓取并解析依赖。移除依赖forc removeforc remove dep [--contract-dep] [--package NAME] [--manifest-path PATH]# 从 [dependencies] 移除 forc remove custom_lib # 从 [contract-dependencies] 移除 forc remove my_contract --contract-dep # 在 workspace 中针对特定包移除 forc remove custom_lib --package my_project更新依赖forc updateforc update对 path 与 ipfs 依赖没有效果对带 branch 引用的 git 依赖会把项目更新到该分支的最新 commit。forc update同时会维护Forc.lock锁定文件。Workspace多包工作区管理Workspace是作为一个整体被管理的一个或多个包成员的集合官方文档见 Workspaces。核心要点单包可用的 forc 命令如forc build、forc deploy同样适用于 workspace所有成员共享 workspace 根目录下同一个Forc.lock文件可用forc new --workspace或forc init --workspace创建空 workspaceworkspace 清单同样写在Forc.toml中字段包括members与[patch]。members字段以相对于 workspace 根目录的路径列出成员[workspace] members [member1, path/to/member2]位于 workspace 目录内但不在members集合中的包会被忽略。workspace 级[patch]的用法与包级一致用于覆盖 workspace 依赖图中任意依赖但注意如果 workspace 清单中含有 patch 表则其成员包中不允许再声明 patch 表。支持 workspace 的常用命令包括forc build构建整个 workspace、forc deploy按正确顺序构建并部署所有可部署成员、forc run构建并运行全部脚本、forc check、forc update维护共享Forc.lock、forc clean、forc fmt。仓库内的真实多包示例见 examples/multi_contract_calls/包含callee与caller两个成员包及共享Forc.lock与 examples/upgradeable_proxy/proxyimplementation。插件机制扩展 Forc 的命令Forc 原生命令之外的能力通过插件提供。官方文档见 Plugins 章节。插件即一个名为forc-MY_PLUGIN的可执行文件运行时只要把它放进PATHforc MY_PLUGIN ...就会被自动路由到该可执行文件。这一机制在源码层面的实现位于forc/src/cli/mod.rsForc::Plugin(args)变体会调用plugin::execute_external_subcommand(args)查找并执行forc-子命令然后以子进程的退出码结束 Forc 自身。相关插件分发逻辑见forc/src/cli/plugin.rs。用forc plugins命令可以列出已安装的插件$ forc plugins Installed Plugins: forc-installFuel 生态官方维护的常用插件包括forc-fmt格式化、forc-client部署与调用、forc-lsp语言服务、forc-migrate版本迁移等它们大多直接托管在本仓库的forc-plugins/目录下例如 forc-fmt、forc-lsp、forc-debug、forc-doc。文档侧可参见 plugins 目录。值得注意的细节一个插件 crate 可以提供多个命令。例如安装forc-client插件后会同时得到forc deploy与forc run两个命令——这是通过在插件 crate 的 manifest 中声明多个[[bin]]目标实现的。如果自己要编写插件规则很简单插件必须命名为forc-MY_PLUGIN格式可使用clap添加子命令、选项与配置需要注册插件发现时可用仓库scripts/下的相关工具如mdbook-forc-documenter可把插件命令文档化到 Sway Book 中。把 Forc 接入你的开发流程综合以上内容一个典型的 Forc 驱动开发流程如下建项目forc new my_project或forc init初始化已有目录写代码编辑src/main.sw用forc check快速校验类型加依赖forc add dep或手工编辑Forc.toml的[dependencies]/[contract-dependencies]构建forc build产出out/debug/字节码必要时--release测试forc test编译并运行测试测试目录结构可参考 forc-test/test_data部署/运行借助forc-client插件执行forc deploy合约与forc run脚本默认连接本地节点http://127.0.0.1:4000格式化与语言支持forc fmt统一代码风格forc-lsp为编辑器提供补全、跳转与诊断多包协作在 workspace 中用forc build一次性构建全部成员用[patch]灵活覆盖依赖版本用于本地联调。Forc 还提供forc contract-id、forc predicate-root等实用工具用于计算链上地址相关常量以及forc completions为你的 shell 生成命令补全进一步提升日常效率。关于每个命令的精确参数与示例建议在仓库内查阅 Commands 章节 的对应页面关于Forc.toml每个字段的默认值与约束可随时回到 Manifest Reference 核对。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考