跳到主要内容
  1. Skills/
  2. 后端编程/

SublimeText rust 插件设置为 release 模式

·字数 1893·4 分钟
howto rust

有不少开发者,像有悟一样,非常喜欢 Sublime Text 。只因它足够简洁,速度足够快,功能一点也不弱。不过它并非专业IDE,虽然有一定的插件支持,但多数要手动配置,而且还可能不成功。但是用来做为代码阅读器,功能完全满足。

如果使用了 Sublime Text 来开发 rust 程序,或者阅读 rust 代码,通常都会安装:

  • Rust Enhanced ,开发辅助,它扩展了 SublimeText 的 Build System, 提供 cargo buildruntestcheck 等用于编译、运行、测试、检查的快捷命令。提供语法错误与建议等。
  • LSP-rust-analyzer ,开发辅助,提供语法检查、语法辅助、宏展开(属性宏好像不支持展开)等语言服务。

以上也是所有 IDE 中的两大核心功能。

通过 package control 安装
通过 package control 安装

cmd+shift+p,调出 command palette,输入 Install,选择 Package Control: Install PackageEnter,分别安装 Rust EnhancedLSP-rust-analyzer 这两个插件。

Rust Enhanced 最常用的功能的 Build System代码提示

Rust Enhanced 显示错误信息示例
Rust Enhanced 显示错误信息示例

SublimeText 右键菜单的 Rust Enhanced 子菜单
SublimeText 右键菜单的 Rust Enhanced 子菜单

Rust Enhanced 所支持的 Build System
Rust Enhanced 所支持的 Build System

LSP-rust-analyzer 做为后端语言服务存在,为代码开发过程提供支持,优化了代码补全和代码提示的内容、代码定位、定义定位、重命名、格式化等。一般的 LSP 功能有

一般的 LSP 功能
一般的 LSP 功能

配置 release #

rust 编译慢是出名的,而且编译的附属物一般会比较大,位于当前工程的 target 目录下。

通常情况下,使用 cargo buildcargo runcargo checkcargo clippycargo test 都属于 Development,所以编译过程中,会尽可能多的保留更多用于辅助开发和调试的信息。但如果你经常需要阅读他人的 rust 代码,并不负责开发、调试,更多的是在代码阅读过程中,需要使用 “悬停提示”、“跳转到定义处”等帮助理解代码的功能,或者只是想编译运行他人的工程看看效果,那可能会更偏向于使用 cargo build --release,而不是 cargo build 来减少编译总体时间和结果文件的大小。

有悟的电脑是一台老旧的 macboook pro , CPU频率低,磁盘空间小,不得不经常为节省一点点时间与存储空间,花费比较多的时间和精力为工具的使用找一些非主流的设置。

以上斥求,它与面向开发的配置不同。

当前的 SublimeText ,并没有类似于 iterm profiles 的概念,不能在不同配置间切换。rust、cargo、rust-enhanced、lsp-rust-analyzer 等的配置要么是全局的,要么是项目级的,同一范围只能有一种配置情况。

每次都需要手动设定。开发者根据自己的需要进行设置,是 SublimeText 全局还是项目级。

Rust Enhanced 设置 #

  1. 在整个 SublimeText 编辑器启用

无论打开多个项目窗口,Rust Enhanced 的参数均一样。

打开 Rust Enhanced 设置
打开 Rust Enhanced 设置

使用 command palette 的 Rust: Config Cargo Build 非常虚幻,还是打开 Rust Enhanced 的配置文件更直接,搜索 pref rust 找到 Preferences: Rust Enhanced Settings,自动打开用户目录下的 User/RustEnhanced.sublime-settings

// User/RustEnhanced.sublime-settings
{
	...
    "cargo_build": {
        "defaults": {
            // "toolchain": "nightly",
            //"extra_cargo_args": "-Zunstable-options --keep-going" //only for nightly
            "release": true,
            "extra_cargo_args": "--verbose",
        },
        "variants": {
            "auto": {
                "release": true,
                "extra_cargo_args": "--verbose",
            },
        },
    },
}

以上的 RustEnhanced 配置参数,仅突出设置 release,使得 Build With: RustEnhanced 编译命令(cargo build)及其变种 (如 cargo run、cargo check 等) 启动时,都带有 --relase 参数。编译结果在 ./target/release 目录下。

Rust Enhanced release Build
Rust Enhanced release Build

  1. 在项目中设置

覆盖全局配置,仅当前项目有效。配置信息保存在项目的 .sublime-project 文件中。

// debug-me.sublime-project
{
	"folders": [
		{
			"path": ".",
		}
	],
	"settings": {
		"cargo_build": {
			"defaults": {
				"release": true
			},
			"variants": {
				"auto": {
					"release": true,
				},
			},
		},
	},
}

这样,在当前项目的范围内,使用 Build With: RustEnhanced 命令及它变种启动的 cargo 命令均带有 --release 参数。

更多详细设置,参见 Rust Enhanced 的 Build Settings

🔔 Rust Enhanced 的配置优化级覆盖规则如下:

  1. .sublime-project > Cargo Package > Cargo Target
  2. .sublime-project > Cargo Package > Build Variant
  3. .sublime-project > Cargo Package > Defaults
  4. .sublime-project > Build Variant
  5. RustEnhanced.sublime-settings > Build Variant
  6. .sublime-project > Defaults
  7. RustEnhanced.sublime-settings > Defaults

LSP-rust-analyzer 设置 #

LSP-rust-analyzer 插件,调用 rust-analyzer 执行语法分析,会对代码进行编译。你可以在 terminal 执行 cargo build --release 提前编译,或者由 LSP-rust-analyzer 自动调用编辑器对代码进行编译。

LSP-rust-analyzer 自动编译的参数,可以通过配置文件来修改。如 RustEnhanced 的配置相同, LSP-rust-analyzer 的配置也可以是全编辑器实例级,也可以是仅当前项目。

  1. 在整个 SublimeText 编辑器启用

打开 LSP-rust-analyzer 设置
打开 LSP-rust-analyzer 设置

使用 lsp rust 搜索 Preferences: LSP-rust-analyzer Settings,打开用户配置文档 User/LSP-rust-analyzer.sublime-settings

// User/LSP-rust-analyzer.sublime-settings
// Settings in here override those in "LSP-rust-analyzer/LSP-rust-analyzer.sublime-settings"
{
	"command": [
		"/usr/local/bin/rust-analyzer",
	],
	"settings": {
		// --------------------------------
		// for build/test
		// e.g. cargo test
		"rust-analyzer.runnables.extraArgs": [
			"--verbose",
			"--release",
		],
		// --------------------------------
		// for check on save
		// 注意不要与 rust-analyzer.cargo.extraArgs 重复
		"rust-analyzer.check.extraArgs": [
			"--verbose",
			"--jobs",
			"2",
			// "--release", // cargo.extraArgs 的 --release 会传入
		],
		"rust-analyzer.cargo.extraArgs": [
			"--release",
			// "--verbose", // 这个参数会导致 rust-analyzer 无法展开宏
		],
	},
	"enabled": true,
}

LSP-rust-analyzer 的参数非常多,这里仅列出可达到本文目的的参数。

  1. 仅在项目中配置

上面在 LSP-rust-analyzer.sublime-settings 配置的项,在项目的 .sublime-project 中,位置与结构如下:

// debug-me.sublime-project
{
	...
	"settings": {
		"cargo_build": ...
		"LSP": {
			"rust-analyzer": {
				// 与 LSP-rust-analyzer.sublime-settings 中的 Settings 相同。
				"settings": {
					"rust-analyzer.runnables.extraArgs": ["--release"],
					"rust-analyzer.cargo.extraArgs": ["--release"],
				}
			}
		}
	}
}

实测,需要设置的参数项有二个,rust-analyzer.cargo.extraArgsrust-analyzer.runnables.extraArgs

runnables.extraArgs 会影响 cargo build/testcargo.extraArgs 会影响除 cargo build/test 之外的 cargo 命令,如 cargo check

LSP-rust-analyzer release 编译
LSP-rust-analyzer release 编译