在 Linux 系统上配置 Rust 编程环境,核心思路是使用官方工具rustup来安装并管理工具链。
安装 Rust 工具链
基于Debian体系,直接使用 Ubuntu/Debian 的软件包管理方式。使用rustup安装 Rust 是较稳妥的选择,因为它会为你安装一个独立的、较新的工具链,而系统自带的rustc版本可能过旧。
首选方案:使用官方rustup安装
这种方法最通用,能确保获得最新版本的 Rust 工具链,并支持多版本共
第一步:安装依赖
sudo apt update# 安装编译工具链(如果还没有)sudo apt install -y build-essential pkg-config# 如果将来需要编译一些依赖系统库的 crate,可能需要sudo apt install -y libssl-dev libudev-dev
第二步:使用 rustup 安装 Rust
#下载并运行安装脚本curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
第三步:配置环境变量
安装完成后,运行以下命令让 Rust 命令立即生效:
第四步:配置国内镜像源
为了避免下载依赖时网络超时,配置 Cargo 使用国内镜像:
#创建 Cargo 配置目录mkdir -p ~/.cargo# 写入配置(使用中科大镜像)cat > ~/.cargo/config << 'EOF'[source.crates-io]replace-with = 'ustc'[source.ustc]registry = "https://mirrors.ustc.edu.cn/crates.io-index"[net]git-fetch-with-cli = trueEOF
第五步:验证安装
#查看 Rust 版本rustc --version# 查看 Cargo 版本cargo --version# 查看工具链安装位置which rustc# 应该显示 /home/gxxc/.cargo/bin/rustc(用户目录下,与系统隔离)
第六步:创建第一个项目测试
#创建一个新项目cargo new hello_linuxcd hello_linux# 编译并运行cargo run
下面分析一个Bevy测试程序
use bevy::prelude::*;use bevy::app::AppExit;fnmain() { App::new() // ==配置与插件== .add_plugins(DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { title: "Bevy 0.12 Test".into(), resolution: (800., 600.).into(), ..default() }), ..default() })) .add_systems(Startup, setup) .add_systems(Update, exit_on_esc) // ==配置与插件== .run();}
App::new()创建了一个新的 Bevy 应用实例,然后通过链式调用(.)为其添加各种配置和功能,最后.run()启动游戏主循环。
.add_plugins(DefaultPlugins):这是 Bevy 的“开箱即用”开关。DefaultPlugins是一个插件的集合,它会自动帮你设置好窗口管理、2D/3D 渲染、音频、输入处理、UI 系统等一系列核心功能。没有它,你的程序只是一个空壳,无法显示任何东西。
.set(WindowPlugin {...}):我们修改了默认的WindowPlugin插件,来定制自己的窗口。在这里,我们将窗口的title(标题)设置为 "Bevy 0.12 Test",resolution(分辨率)设置为800x600。..default()是一个语法糖,表示“其余所有设置都保持默认值”。
.add_systems(Startup, setup).add_systems(Update, exit_on_esc)
这是整个程序最核心的逻辑连接,它定义了“在什么时机做什么事”。
.add_systems(Startup, setup):这条命令告诉 Bevy,在程序刚启动时,只运行一次setup这个系统(函数)。这里通常用来初始化相机、加载资源、生成初始的实体。
.add_systems(Update, exit_on_esc):这条命令告诉 Bevy,在每一帧(Update)的更新阶段,都要运行一次exit_on_esc系统。它就像一个永不停歇的监听器,每时每刻都在检查 ESC 键是否被按下。
fnsetup(mut commands: Commands) { commands.spawn(Camera2dBundle::default()); commands.spawn(TextBundle::from_section( "Bevy 0.12 on ARM64!\nPress ESC Exit", TextStyle { font_size: 50.0, color: Color::GREEN, ..default() }, ).with_style(Style { position_type: PositionType::Absolute, top: Val::Px(50.0), left: Val::Px(50.0), ..default() }));}
setup是一个系统,它的参数mut commands: Commands是一个命令缓冲区,可以理解成一个“待办清单”。在 Bevy 的 ECS 架构中,我们不能直接“创建”一个物体,而是要“下达命令”来生成它。
1. 第1个commands.spawn命令生成了一个 2D 相机实体。Camera2dBundle是一个包含了位置、投影矩阵等相机所需组件的“套餐”,::default()表示使用它默认的设置。没有相机,你就看不到游戏世界中的任何东西。
2. 第2个commands.spawn命令生成了一个文本实体。
TextBundle::from_section(...):创建了一个包含文本的套餐。
TextStyle:定义了文字的样式,字号 50.0,颜色 GREEN。
.with_style(Style {...}):定义了这个文本在屏幕上的布局,PositionType::Absolute 表示绝对定位,top: 50.0, left: 50.0 将它固定在距离窗口左上角 50 像素的位置。
//这个系统会在每一帧都被调用,用来检查输入并决定是否退出。fnexit_on_esc( keyboard_input: Res<Input<KeyCode>>, mut exit: EventWriter<AppExit>,) { if keyboard_input.just_pressed(KeyCode::Escape) { exit.send(AppExit); }}