Sway 的 Fuel 工具链全解析:Forc、语言服务器、代码格式化器与 Fuel Core
2026/9/12 12:29:38 网站建设 项目流程

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 的说明,其核心组件包括:

组件命令职责
Forcforc项目创建、构建、测试、部署的入口(Fuel Orchestrator)
Sway Language Serverforc-lsp向 IDE 暴露语言服务能力(补全、诊断、跳转等)
Sway Formatterforc-fmtSway 代码的规范化格式化器
Fuel Corefuel-coreFuel 协议节点的实现,构成运行/测试环境

这四个组件中,forcforc-lspforc-fmt的实现均位于当前仓库内,而fuel-core属于独立的协议节点项目;本仓库的 Cargo.toml 中以依赖形式引用了fuel-core-clientfuel-core-storagefuel-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-lspforc-fmtforc-deployforc runforc docforc debugforc migrateforc publishforc cryptoforc nodeforc 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 插件会自动启动它,但forcforc-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 fmt

forc 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_indentationtest_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-corefuels-accounts引用了 Rust SDK,印证了这一"SDK 自动管理节点"的工作方式。

组合起来:一个完整的开发循环

将四个组件串联起来,一条典型的 Sway 开发流程如下:

  1. 初始化项目forc new my_contract,得到包含Forc.tomlsrc/main.sw的标准项目骨架;
  2. 编写代码:在 VS Code(或 helix、vim 等)中编辑 Sway 源码,forc-lsp由插件自动拉起,提供补全与诊断;
  3. 格式化:保存文件时自动触发forc-fmt,或在 CI 中执行forc fmt --check校验格式;
  4. 构建与测试forc build编译项目,forc test运行测试;若使用 Rust SDK 编写测试,fuel-core节点会被自动启动与回收,无需手动干预;
  5. 部署与交互:使用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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询