Sway 的 Fuel 工具链全解析:Forc、语言服务器、代码格式化器与 Fuel Core
【免费下载链接】sway🌴 Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway
本篇技术指南以 Sway 官方文档《The Fuel Toolchain》为核心骨架,系统拆解 Fuel 工具链的四个核心组件——forc(Fuel Orchestrator)、forc-lsp(Sway 语言服务器)、forc-fmt(Sway 格式化器)与fuel-core(Fuel 协议节点实现),并结合本仓库(FuelLabs/sway)的实际源码逐一印证其实现细节。读完本文,你将掌握每个组件的职责边界、常用命令与配置方式,能够搭建一套完整的 Sway 智能合约开发、格式化、IDE 辅助与链上测试环境。
Fuel 工具链的整体构成
Fuel 工具链(Fuel toolchain)由多个组件共同组成,覆盖了 Sway 语言从编写、格式化、语言分析到部署验证的完整开发闭环。根据 fuel_toolchain.md 的说明,其核心组件包括:
| 组件 | 命令 | 职责 |
|---|---|---|
| Forc | forc | 项目创建、构建、测试、部署的入口(Fuel Orchestrator) |
| Sway Language Server | forc-lsp | 向 IDE 暴露语言服务能力(补全、诊断、跳转等) |
| Sway Formatter | forc-fmt | Sway 代码的规范化格式化器 |
| Fuel Core | fuel-core | Fuel 协议节点的实现,构成运行/测试环境 |
这四个组件中,forc、forc-lsp、forc-fmt的实现均位于当前仓库内,而fuel-core属于独立的协议节点项目;本仓库的 Cargo.toml 中以依赖形式引用了fuel-core-client、fuel-core-storage、fuel-core-types(均为 0.48 版本),从依赖关系上可以印证"Fuel 工具链以 fuel-core 作为底层节点"的架构事实。
Forc:Fuel Orchestrator
定位:Sway 世界里的 Cargo
forc全称Fuel Orchestrator,是 Sway 生态中与 Rust 的cargo对等的工具。在 forc/README.md 中明确写道:"If you're coming from a Rust background,forcis similar tocargo",它提供项目脚手架创建、格式化、脚本运行、合约部署、合约测试等一系列能力,是 Sway 开发的主要入口。
CLI 结构与内置命令
从源码看,forc 的 CLI 定义位于 forc/src/cli/mod.rs,通过clap声明了顶层参数(全局的-v/--verbose、-s/--silent、-L/--log-level)与内置子命令。内置命令实现位于 forc/src/cli/commands,完整清单如下:
forc new/forc init:创建/初始化新项目forc build(别名b):编译项目forc check:类型检查forc test(别名t):运行测试forc add/forc remove:管理依赖forc update:更新依赖forc clean:清理构建产物forc parse-bytecode:解析字节码forc contract-id/forc predicate-root:计算合约 ID / 谓词根forc completions:生成 shell 补全forc template:使用模板生成项目forc plugins:列出已安装插件forc addr2line:字节码地址到源码行号映射
插件机制:forc-<subcommand>约定
forc 并非只支持上述内置命令。从 forc/src/cli/mod.rs 的源码结构看,Forc枚举中存在一个Plugin(Vec<String>)变体,其注释说明了 catch-all 机制:当收到未知子命令时,forc 会查找名为forc-<unknown-subcommand>的可执行文件并尝试执行它(forc-<unknown-subcommand> <args>)。这正是forc-lsp、forc-fmt、forc-deploy、forc run、forc doc、forc debug、forc migrate、forc publish、forc crypto、forc node、forc call等插件能够以forc <插件名>形式被调用的底层原因——它们在 Cargo.toml 工作区中以forc-plugins/*成员统一组织。
Sway Language Server(forc-lsp)
作用与安装前提
forc-lsp是 Sway 语言服务器(Language Server Protocol 实现),用于向 IDE 提供智能感知能力。它的安装方式请参考 Sway LSP 安装文档。需要特别注意的是:
forc-lsp随 Fuel 工具链一并安装,任何 IDE 插件要正常工作都必须先装好它;- 无需手动运行
forc-lsp,IDE 插件会自动启动它,但forc和forc-lsp都必须位于$PATH中——在终端执行forc --help即可确认forc是否可用。
IDE 支持情况
根据 lsp/installation.md 的说明,各编辑器的支持现状如下:
| 编辑器 | 支持方式 |
|---|---|
| VSCode | 支持最完善,安装 Sway 插件即可(仅支持最新版 VS Code) |
| Code OSS(Linux) | 先安装 code-marketplace 获得插件市场访问权,再安装 Sway 扩展 |
| vim / neovim | 通过 sway.vim 安装 |
| helix | 内置支持,基于 tree-sitter-sway |
| Emacs | 规划中 |
源码级实现
forc-lsp本体位于 forc-plugins/forc-lsp,其 main.rs 的实现非常精简:声明App {}空参数结构后,直接调用sway_lsp::start().await启动语言服务器;同时通过tikv-jemallocator为进程设置 Jemalloc 全局分配器,以优化内存表现。真正的 LSP 能力(补全、诊断、跳转、hover 等)由 sway-lsp/src/capabilities 目录下的 36 个能力模块实现,底层基于tower-lsp(见 Cargo.toml 中的依赖声明)。
Sway Formatter(forc-fmt)
手动运行
forc-fmt是 Sway 的规范化(canonical)格式化器,可以手动执行:
forc fmtforc fmt默认针对当前目录下的项目生效,同时支持面向不同粒度的参数。从 forc-fmt/src/main.rs 的 CLI 定义可以整理出完整参数表:
| 参数 | 短选项 | 作用 |
|---|---|---|
--check | -c | 检查模式:格式正确则退出码为 0;需要格式化时退出码为 1,并打印 diff |
--path <path> | -p | 指定项目目录,默认使用当前工作目录 |
--file <file> | -f | 仅格式化单个.sw文件(使用默认配置) |
典型用法示例(与源码中cli_examples!宏声明的示例一致):
# 检查模式运行(CI 中常用) forc fmt --check # 对指定目录的项目进行格式化 forc fmt --path path/to/project # 只格式化某个 Sway 文件 forc fmt --file path/to/project/src/main.sw底层行为细节
从 forc-fmt/src/main.rs 的源码实现可以观察到以下行为:
- 配置优先级:格式化器通过
Formatter::from_dir从目录读取配置(如swayfmt.toml)。在工作区(workspace)场景下,配置优先级为"成员项目 > 工作区根目录 > 默认值"; - Manifest 也会被格式化:除了
.sw文件,Forc.toml清单文件还会通过taplo格式化器处理(taplo_fmt::format),且测试用例(test_forc_indentation、test_forc_alphabetization)验证了其能规范化缩进与键顺序; - check 模式的 diff 展示:使用
prettydiff计算差异,新增行绿色+、删除行红色-,最多展示 100 处更新; - 文件保护:若目标文件正在编辑器中打开且存在未保存修改,会拒绝格式化并提示先保存(
is_file_dirty检查); - 工作区递归:会递归寻找包含
Forc.toml的子目录逐一格式化,避免重复格式化成员目录的同时覆盖工作区根目录下的散落 Sway 文件。
VS Code 中的自动格式化
在 VS Code 中,Sway 插件会在保存文件时自动调用forc-fmt进行格式化,但可能需要将 Sway 插件显式设置为 Sway 文件的默认格式化器。按原文档给出的方式,在 VS Code 设置(settings.json)中写入:
"[sway]": { "editor.defaultFormatter": "FuelLabs.sway-vscode-plugin" }这样当你在 VS Code 中保存.sw文件时,就会自动触发forc-fmt完成格式化。
Fuel Core(fuel-core)
fuel-core是 Fuel 协议(Fuel protocol)的一种实现,它与 Sway 工具链共同构成了完整的 Fuel 工具链——Sway 工具链负责"写代码、编代码",而fuel-core负责"跑代码、执行链上环境"。
对绝大多数开发场景而言,你并不需要手动启动节点:Rust SDK(fuels-rs)在运行测试时会自动启动并停止一个节点实例。只有在不使用 SDK、直接用forc进行部署/交互时,才需要手动运行节点。本仓库 Cargo.toml 中以fuel-core-client = "0.48.0"、fuel-core-storage = "0.48"、fuel-core-types = "0.48"等依赖引用了 fuel-core 相关 crate,同时以fuels = "0.77"、fuels-core、fuels-accounts引用了 Rust SDK,印证了这一"SDK 自动管理节点"的工作方式。
组合起来:一个完整的开发循环
将四个组件串联起来,一条典型的 Sway 开发流程如下:
- 初始化项目:
forc new my_contract,得到包含Forc.toml与src/main.sw的标准项目骨架; - 编写代码:在 VS Code(或 helix、vim 等)中编辑 Sway 源码,
forc-lsp由插件自动拉起,提供补全与诊断; - 格式化:保存文件时自动触发
forc-fmt,或在 CI 中执行forc fmt --check校验格式; - 构建与测试:
forc build编译项目,forc test运行测试;若使用 Rust SDK 编写测试,fuel-core节点会被自动启动与回收,无需手动干预; - 部署与交互:使用
forc deploy/forc run/forc call等插件命令与链上环境交互(此时才需要显式准备节点环境)。
工具的完整命令手册可以在 Sway 手册 Forc Reference 章节 中查阅,各命令的详细用法亦可通过forc <command> --help在本地直接查看。
【免费下载链接】sway🌴 Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考