Fish Shell 项目中的 Rust 开发指南

Fish Shell 项目中的 Rust 开发指南

fish-shell The user-friendly command line shell. fish-shell 项目地址: https://gitcode.com/gh_mirrors/fi/fish-shell

本文将为开发者详细介绍如何在 Fish Shell 项目中开展 Rust 开发工作。Fish Shell 正在经历从 C++ 到 Rust 的渐进式迁移过程,这一转变带来了许多技术挑战和机遇。

项目背景与架构概述

Fish Shell 是一个现代化的命令行 shell,长期以来主要使用 C++ 开发。目前项目正处于向 Rust 迁移的过程中,采用了一种渐进式的迁移策略:

  1. 项目中嵌入了名为 fish-rust 的 Rust crate
  2. 该 crate 构建出 Rust 库 libfish_rust.a
  3. 这个 Rust 库与现有的 C++ 库 libfish.a 进行链接

这种架构设计允许团队逐步将 C++ 代码迁移到 Rust,而不会一次性破坏整个项目。

开发环境搭建

依赖准备

要参与 Fish Shell 的 Rust 开发,你需要:

  1. Rust 1.70 或更高版本
  2. CMake 构建工具
  3. 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 的基本流程如下:

  1. 选择要迁移的 .cpp 或 .h 文件(例如 util.cpp
  2. fish-rust/ 目录下创建对应的 Rust 文件(如 util.rs
  3. 在 Rust 中重新实现功能,尽可能保持与 C++ 代码一致
    • 可以将原 C++ 代码注释在 Rust 文件中,逐行转换
    • 即使会导致 Rust 代码不够地道,也应优先保持功能一致
  4. 决定调用关系:
    • 工具函数可以同时保留 Rust 和 C++ 实现
    • 主要组件(如内置命令)不应重复实现,而应通过 FFI 调用

代码质量保证

在开发过程中,请确保:

  1. 定期运行 cargo fmt 保持代码格式统一
  2. 使用 cargo clippy 进行静态检查
  3. 如果使用 rust-analyzer,可以设置 rust-analyzer.checkOnSave.command = "clippy" 实现保存时自动检查

类型系统与字符串处理

类型映射策略

在跨语言边界时,需要注意:

  1. 常量和类型别名需要手动转换
    • #definestatic const → Rust 的 pub const
    • typedefusing → Rust 的 type/struct/enum
  2. 非 POD 类型需要通过引用或指针传递

字符串处理方案

Fish Shell 主要使用宽字符串,在 Rust 中的实现策略如下:

  1. 主要使用 widestring crate 提供的 WString&wstr 类型
    • WString 是拥有所有权的 UTF32 字符串
    • &wstr 是借用的 UTF32 字符串切片
  2. 类型对应关系:
    • C++ 的 wcstring → Rust 的 WString
    • C++ 的 const wcstring & → Rust 的 &wstr
    • C++ 的 const wchar_t * → Rust 的 &wstr
字符串创建示例
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 边界处,我们使用一些临时类型:

  1. CxxWString:对应 C++ 的 std::wstring
  2. W0String:带 nul 终止符的 WString
  3. wcharz_t:包装 const wchar_t * 的结构体

这些类型应仅限于 FFI 模块内部使用。

开发工具与技巧

实用工具推荐

  1. cargo-expand:查看 autocxx 生成的 Rust 绑定
    • 安装:cargo install cargo-expand
    • 使用:cargo expand
  2. rust-analyzer 配置:
    • 启用 Proc Macro 和 Proc Macro Attributes 支持

FFI 开发注意事项

Fish Shell 项目使用了修改版的 autocxxcxx

  1. 放宽了对指针函数必须标记 unsafe 的要求
  2. 增加了对 wchar_tCxxWString 的支持

这些修改使得 FFI 开发更加顺畅,减少了不必要的安全标记噪音。

总结

Fish Shell 向 Rust 的迁移是一个渐进式的过程,开发者需要同时处理两种语言的交互。本文介绍了项目架构、开发流程、类型系统和工具链等方面的关键知识,希望能帮助开发者顺利参与这一激动人心的现代化改造工程。

记住,虽然现阶段可能需要一些妥协和临时解决方案,但最终目标是将项目完全迁移到 Rust,享受其安全性、性能和现代化工具链带来的好处。

fish-shell The user-friendly command line shell. fish-shell 项目地址: https://gitcode.com/gh_mirrors/fi/fish-shell

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅琛卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值