Fish Shell 项目中的 Rust 开发指南
fish-shell The user-friendly command line shell. 项目地址: https://gitcode.com/gh_mirrors/fi/fish-shell
本文将为开发者详细介绍如何在 Fish Shell 项目中开展 Rust 开发工作。Fish Shell 正在经历从 C++ 到 Rust 的渐进式迁移过程,这一转变带来了许多技术挑战和机遇。
项目背景与架构概述
Fish Shell 是一个现代化的命令行 shell,长期以来主要使用 C++ 开发。目前项目正处于向 Rust 迁移的过程中,采用了一种渐进式的迁移策略:
- 项目中嵌入了名为
fish-rust
的 Rust crate - 该 crate 构建出 Rust 库
libfish_rust.a
- 这个 Rust 库与现有的 C++ 库
libfish.a
进行链接
这种架构设计允许团队逐步将 C++ 代码迁移到 Rust,而不会一次性破坏整个项目。
开发环境搭建
依赖准备
要参与 Fish Shell 的 Rust 开发,你需要:
- Rust 1.70 或更高版本
- CMake 构建工具
- Ninja 或其他构建系统
构建流程
推荐在 fish-shell/build
目录下进行构建,这样 Rust 能更容易找到 config.h
文件。
完整构建流程如下:
$ cd fish-shell
$ mkdir build && cd build
$ cmake -G Ninja ..
$ ninja
这个命令会生成完整的 fish 可执行文件。
如果只想构建 Rust 部分,可以在完成 CMake 配置后:
$ cd fish-shell/fish-rust
$ cargo build
这种方式只构建 Rust 库,适合快速迭代 Rust 代码开发。
开发流程详解
代码迁移策略
迁移 C++ 代码到 Rust 的基本流程如下:
- 选择要迁移的 .cpp 或 .h 文件(例如
util.cpp
) - 在
fish-rust/
目录下创建对应的 Rust 文件(如util.rs
) - 在 Rust 中重新实现功能,尽可能保持与 C++ 代码一致
- 可以将原 C++ 代码注释在 Rust 文件中,逐行转换
- 即使会导致 Rust 代码不够地道,也应优先保持功能一致
- 决定调用关系:
- 工具函数可以同时保留 Rust 和 C++ 实现
- 主要组件(如内置命令)不应重复实现,而应通过 FFI 调用
代码质量保证
在开发过程中,请确保:
- 定期运行
cargo fmt
保持代码格式统一 - 使用
cargo clippy
进行静态检查 - 如果使用 rust-analyzer,可以设置
rust-analyzer.checkOnSave.command = "clippy"
实现保存时自动检查
类型系统与字符串处理
类型映射策略
在跨语言边界时,需要注意:
- 常量和类型别名需要手动转换
#define
或static const
→ Rust 的pub const
typedef
或using
→ Rust 的type
/struct
/enum
- 非 POD 类型需要通过引用或指针传递
字符串处理方案
Fish Shell 主要使用宽字符串,在 Rust 中的实现策略如下:
- 主要使用
widestring
crate 提供的WString
和&wstr
类型WString
是拥有所有权的 UTF32 字符串&wstr
是借用的 UTF32 字符串切片
- 类型对应关系:
- C++ 的
wcstring
→ Rust 的WString
- C++ 的
const wcstring &
→ Rust 的&wstr
- C++ 的
const wchar_t *
→ Rust 的&wstr
- C++ 的
字符串创建示例
use crate::wchar::prelude::*;
fn get_shell_name() -> &'static wstr {
L!("fish")
}
或者使用后缀语法:
use crate::wchar::{wstr, widestrs}
#[widestrs]
fn get_shell_name() -> &'static wstr {
"fish"L
}
FFI 边界字符串处理
在 FFI 边界处,我们使用一些临时类型:
CxxWString
:对应 C++ 的std::wstring
W0String
:带 nul 终止符的WString
wcharz_t
:包装const wchar_t *
的结构体
这些类型应仅限于 FFI 模块内部使用。
开发工具与技巧
实用工具推荐
cargo-expand
:查看 autocxx 生成的 Rust 绑定- 安装:
cargo install cargo-expand
- 使用:
cargo expand
- 安装:
- rust-analyzer 配置:
- 启用 Proc Macro 和 Proc Macro Attributes 支持
FFI 开发注意事项
Fish Shell 项目使用了修改版的 autocxx
和 cxx
:
- 放宽了对指针函数必须标记
unsafe
的要求 - 增加了对
wchar_t
和CxxWString
的支持
这些修改使得 FFI 开发更加顺畅,减少了不必要的安全标记噪音。
总结
Fish Shell 向 Rust 的迁移是一个渐进式的过程,开发者需要同时处理两种语言的交互。本文介绍了项目架构、开发流程、类型系统和工具链等方面的关键知识,希望能帮助开发者顺利参与这一激动人心的现代化改造工程。
记住,虽然现阶段可能需要一些妥协和临时解决方案,但最终目标是将项目完全迁移到 Rust,享受其安全性、性能和现代化工具链带来的好处。
fish-shell The user-friendly command line shell. 项目地址: https://gitcode.com/gh_mirrors/fi/fish-shell
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考