1. 搭建 rust 开发环境
1.1 安装 Rust
1.1.1 Linux 上安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
1.1.2 Windows 上安装 Rust
64位安装包
https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe
32位安装包
https://static.rust-lang.org/rustup/dist/i686-pc-windows-msvc/rustup-init.exe
The Cargo home directory is located at: C:\Users\a2911\.cargo This can be modified with the CARGO_HOME environment variable. The cargo, rustc, rustup and other commands will be added to Cargo's bin directory, located at: C:\Users\a2911\.cargo\bin This path will then be added to your PATH environment variable by modifying the HKEY_CURRENT_USER/Environment/PATH registry key. You can uninstall at any time with rustup self uninstall and these changes will be reverted. Current installation options: default host triple: x86_64-pc-windows-msvc default toolchain: stable (default) profile: default modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation >
你可以选择 :
1) Proceed with installation
(继续安装)Customize installation
(自定义安装)
这里我们选择 1:
>1
安装程序将边下载边安装:
info: profile set to 'default' info: default host triple is x86_64-pc-windows-msvc info: syncing channel updates for 'stable-x86_64-pc-windows-msvc' info: latest update on 2023-04-20, rust version 1.69.0 (84c898d65 2023-04-16) info: downloading component 'cargo' info: downloading component 'clippy' info: downloading component 'rust-docs' 13.4 MiB / 13.4 MiB (100 %) 7.4 MiB/s in 2s ETA: 0s info: downloading component 'rust-std' 25.1 MiB / 25.1 MiB (100 %) 11.2 MiB/s in 2s ETA: 0s info: downloading component 'rustc' 58.9 MiB / 58.9 MiB (100 %) 10.2 MiB/s in 5s ETA: 0s info: downloading component 'rustfmt' info: installing component 'cargo' info: installing component 'clippy' info: installing component 'rust-docs' 13.4 MiB / 13.4 MiB (100 %) 1.6 MiB/s in 6s ETA: 0s info: installing component 'rust-std' 25.1 MiB / 25.1 MiB (100 %) 13.2 MiB/s in 1s ETA: 0s info: installing component 'rustc' 58.9 MiB / 58.9 MiB (100 %) 14.5 MiB/s in 4s ETA: 0s info: installing component 'rustfmt' info: default toolchain set to 'stable-x86_64-pc-windows-msvc' stable-x86_64-pc-windows-msvc installed - rustc 1.69.0 (84c898d65 2023-04-16) Rust is installed now. Great! To get started you may need to restart your current shell. This would reload its PATH environment variable to include Cargo's bin directory (%USERPROFILE%\.cargo\bin). Press the Enter key to continue.
点击回车键继续,安装完成,程序退出。
希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流
1.2 安装 Rust 的 VSCode 插件
1.2.1 rust-analyzer 插件
这个扩展提供了对Rust编程语言的支持。推荐使用它,它将取代rust-lang.rust。你可以在以下地址找到它:
https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer
1.2.2 Better TOML 插件
与 nodeJS 项目直接使用 .json
后缀的文件用作配置(packages.json
)不同,rust
语言的项目使用通过一款相对小众的文件格式,其文件后缀为.toml
(TOML文件)。VSCode中本身并不支持 .toml
语法高亮,不过好在当然有第三方库—— Better TOML。
Better TOML 是一款用于支持 TOML 文件的 VSCode 插件。我们可以直接在 VScode 中搜索安装:
1.3 关于 Rust 的更新
Rust 的更新非常频繁。如果你已经安装了Rustup,很可能你的Rust版本已经过时了。通过运行rustup update
获得Rust的最新版本。
关于 rustup 工具,将在下一节更加详细地介绍。
2. Rust安装程序和版本管理工具: rustup
2.1 rustup 的安装位置
当安装 rust
的时候,rustup
自动地被安装。 对于 Windows 系统 一般而言,在你的用户主目录下,将由一个 .cargo
文件夹,其中的 bin
子目录存放的是 rust 的各个二进制可执行文件。
比如,我当前登陆的用户名位 a2911,对应的,我的用户主目录为C:\Users\a2911,而这些可执行文件就位于 C:\Users\a2911\.cargo\bin:
如果你无法执行命令如 rustup
等命令(提示不能识别),则需要手动将该位置添加到系统的 path
环境变量中。
2.2 rustup 的用法
2.2.1 rustup 命令行语法格式
rustup.exe
提供以下命令语法格式
rustup [OPTIONS] [+toolchain] <SUBCOMMAND>
2.2.2 rustup 命令参数与选项解析
OPTIONS 表示选项,各个选项的 简写、全写、含义如下:
-v
,--verbose
启用详细输出-q
,--quiet
禁用进度输出-h
,--help
打印帮助信息-V
,--version
打印版本信息
参数部分:
<+toolchain>
释放通道(例如 +stable)或自定义工具链以设置覆盖
SUBCOMMANDS 表示 子命令,包括:
show
显示活动的和已安装的工具链或profilesupdate
更新Rust工具链和rustupcheck
检查Rust toolchains和rustup的更新default
设置默认工具链toolchain
修改或查询已安装的工具链target
修改工具链支持的目标component
修改工具链的已安装组件override
修改目录工具链覆盖run
使用为给定工具链配置的环境运行命令which
显示给定命令将运行哪个二进制文件doc
打开当前工具链的文档self
修改升级安装set
更改升级设置completions
为您的shell生成制表符结束脚本help
打印此消息或给定子命令的帮助
3. Rust包管理器:cargo
3.1 cargo 是什么
除了上一节介绍的 rustup
工具外,还需要介绍一下 cargo
工具——他就相当于 npm
于 nodeJS
一样,是 rust包的管理工具。当然,rust
官方有 与之对应的包注册官网:https://crates.io/:
你可以使用该网站查询你想要的 rust
包。
3.2.1 cargo 命令行语法格式
rustup.exe
提供以下命令语法格式
cargo [+toolchain] [OPTIONS] [COMMAND]
3.2.2 cargo 命令参数与选项解析
1. 选项(Options):
cargo 命令具有以下选项:
-V
,--version
打印版本信息并退出
--list
列出已安装的命令--explain <CODE>
运行rustc --explain CODE
-v
,--verbose
… 使用详细输出(-vv very verbose/build.rs输出)-q
,--quiet
不要打cargo 物日志信息--color <WHEN>
着色: auto, always, never-C <DIRECTORY>
在做任何事情之前切换到目录 (nightly-only)
--frozen
要求 Cargo.lock 和 cache 是最新的--locked
要求 Cargo.lock 是最新的--offline
不访问网络运行--config <KEY=VALUE>
覆盖配置值
-Z <FLAG>
Cargo的不稳定(nightly-only)标志,详情见cargo -Z help
-h
,--help
打印帮助信息
2. 命令(Commands):
build
,b
编译当前包check
,c
分析当前包并报告错误,但不构建目标文件clean
删除 target 目录doc
,d
构建此包及其依赖项的文档new
创建新的 cargo 包init
在现有目录中创建新的 cargo 包add
向清单文件添加依赖项remove
从清单文件中移除依赖项run
,r
运行本地包的二进制或示例test
,t
运行测试bench
运行 benchmarksupdate
更新 Cargo.lock 中列出的依赖项search
搜索 crates 注册表publish
打包并将此包上传到注册表install
安装一个Rust二进制文件。默认位置是 $HOME/.cargo/binuninstall
卸载Rust二进制文件
注:
- 一些常见的cargo命令有(参见所有带
--list
的命令)
4. rust 项目构建与 rustc
工具(rust 语言的编译器)
4.1 cargo build
命令
在 Cargo 小节没有详细介绍过其子命令,其中就有一个 build
子命令,其功能是 编译本地包及其所有依赖项,其语法格式为:
cargo build [options]
其中 options 表示选项:
Package选择 选项
默认情况下,当没有给出包选择选项时,所选择的包取决于所选择的清单文件(如果没有给出
--manifest-path
,则基于当前工作目录)。如果清单是工作区的根,则选择工作区的默认成员,否则只选择清单定义的包。可以使用根清单中的workspace.default-members键显式设置工作区的默认成员。如果没有设置,虚拟工作空间将包括所有的工作空间成员(相当于传入选项
--workspace
),而非虚拟工作空间将只包括root crate本身。
-p spec…
,--package spec…
仅构建指定的包。该标志可以多次指定,并支持常见的Unix全局模式,如*
、?
和[]
。然而,为了避免您的shell在Cargo处理glob模式之前意外扩展它们,您必须在每个模式周围使用单引号或双引号。--workspace
构建工作区中的所有成员。--all
不推荐使用--workspace
。--exclude SPEC…
排除指定的包。必须与--workspace
标志一起使用。该标志可以多次指定,并支持常见的Unix全局模式,如*
、?
和[]
。然而,为了避免您的shell在Cargo处理glob模式之前意外扩展它们,您必须在每个模式周围使用单引号或双引号。
Target选择 选项
当没有给出目标选择选项时,cargo build将构建所选包的所有二进制和库目标。如果二进制文件缺少必需的特性,它们将被跳过。如果选择了要构建的集成测试或基准,那么二进制目标会自动构建。这允许集成测试执行二进制代码来测试它的行为。构建集成测试时会设置 CARGO_BIN_EXE_<name>
环境变量 <https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates>
以便它可以使用env宏 <https://doc.rust-lang.org/std/macro.env.html>
来定位可执行文件。传递目标选择标志将只构建指定的目标。注意 --bin
、 --example
、 --test
和 --bench
标志也支持常见的Unix全局模式,如*
、?
和 []
。然而,为了避免 shell 在 Cargo 处理 glob模式 之前意外地扩展它们,您必须在每个 glob模式 周围使用单引号或双引号。
--lib
构建包的库。--bin name…
构建指定的二进制文件。该标志可以多次指定,并支持常见的Unix glob模式。--bins
构建所有二进制目标。--example name…
构建指定的示例。该标志可以多次指定,并支持常见的Unix glob模式。--examples
构建所有示例目标。--test name…
生成指定的集成测试。该标志可以多次指定,并支持常见的Unix glob模式。- -
-tests
在测试模式下构建所有设置了test = true
清单标志的目标。默认情况下,这包括作为单元测试和集成测试构建的库和二进制文件。请注意,这也将构建任何所需的依赖项,因此lib目标可以构建两次(一次作为单元测试,一次作为二进制文件、集成测试等的依赖项。).可以通过在目标的清单设置中设置测试标志来启用或禁用目标。 --bench name…
构建指定的benchmark(基准)。该标志可以多次指定,并支持常见的Unix glob模式。--benches
在基准模式下构建所有设置了bench = true
清单标志的目标。默认情况下,这包括作为基准构建的库和二进制文件,以及基准目标。请注意,这也将构建任何所需的依赖项,因此lib目标可能会构建两次(一次作为基准,一次作为二进制文件、基准等的依赖项。).可以通过在目标的清单设置中设置bench标志来启用或禁用目标。--all-targets
构建所有目标。这相当于指定--lib
、--bins
、--tests
、--benches
、--examples
。
Feature选择 选项
功能标志( Feature Flag)允许您控制启用哪些功能。如果没有给定功能选项,则为每个选定的软件包激活默认功能。
请参见功能文档 https://doc.rust-lang.org/cargo/reference/features.html#command-line-feature-options 了解更多详情。
-F features
,--features features
要激活的以空格或逗号分隔的功能列表。工作空间成员的功能可以用 package-name/feature-name 语法来启用。可以多次指定该标志,从而启用所有指定的功能。--all-features
激活所有选定软件包的所有可用功能。--no-default-features
不要激活所选软件包的默认功能。
Compilation 选项
--target triple
为给定的体系结构构建。默认为主机架构。三元组的一般格式是<arch><sub>-<vendor>-<sys>-<abi>
。 运行rustc --print target-list
以获取受支持目标的列表。可以多次指定该标志。
这也可以用build.target
配置值 https://doc.rust-lang.org/cargo/reference/config.html 来指定。
注意,指定这个标志会使Cargo以不同的模式运行,其中目标工件被放在一个单独的目录中。有关更多详细信息,请参见构建缓存 https://doc.rust-lang.org/cargo/guide/build-cache.html 文档了解更多细节。-r
,--release
使用发布profile文件构建优化的工件。另请参见--profile
选项,通过名称选择特定的配置文件。--profile name
用给定的profile文件构建。请参阅参考文件 https://doc.rust-lang.org/cargo/reference/profiles.html 以了解有关配置文件的更多详细信息。--ignore-rust-version
构建目标,即使所选Rust编译器比项目的 rust-version` 字段中配置的所需Rust版本旧。--timings=fmts
输出每次编译需要多长时间的信息,并随着时间的推移跟踪并发信息。接受可选的逗号分隔的输出格式列表;不带参数的计时将默认为--timings=html.
。指定输出格式(而不是默认格式)是不稳定的,需要-Zunstable-options
。有效的输出格式:
html
(不稳定,需要-Zunstable-options
):将一个人类可读的文件cargo-timing.html写入target/cargo-timings目录,并附上编译报告。如果您想查看以前的运行,也可以在相同的目录下写一个带有时间戳的报告。HTML输出只适合人类使用,不提供机器可读的计时数据。json
(不稳定,需要-Zunstable-options
):发出关于计时信息的机器可读JSON信息。
Output 选项
--target-dir directory
所有生成的工件和中间文件的目录。也可以用CARGO_TARGET_DIR
环境变量或build.target-dir
配置值 https://doc.rust-lang.org/cargo/reference/config.html 来指定。默认为工作空间根目录中的target
。--out-dir directory
将最终工件复制到此目录。此选项不稳定,仅在nightly channel 上可用,并且需要-Z
不稳定选项标志才能启用。 见 https://github.com/rust-lang/cargo/issues/6790 以获取更多信息
Display 选项
-v
,--verbose
使用详细输出。对于包括额外输出(如依赖关系警告和构建脚本输出)的“very verbose(非常详细)”输出,可以指定两次。也可以用term.verbose
配置值指定 https://doc.rust-lang.org/cargo/reference/config.html。-q
,--quiet
不要打印 cargo 日志信息。也可以用term.quiet配置值指定。https://doc.rust-lang.org/cargo/reference/config.html--color when
控制何时使用彩色输出。有效值:
auto
(默认):自动检测终端是否支持颜色。always
:始终显示颜色。never
:从不显示颜色。
也可以用term.color
配置值指定。 https://doc.rust-lang.org/cargo/reference/config.html
--message-format fmt
诊断消息的输出格式。可以多次指定,由逗号分隔的值组成。有效值:
human
(默认): 以人类可读的文本格式显示。与short和json冲突。short
: 发出更短的、人类可读的文本消息。与human和json的冲突。json
: 向stdout发出JSON消息。详情见参考https://doc.rust-lang.org/cargo/reference/external-tools.html#json-messages。与人类的冲突和短暂。json-diagnostic-short
: 确保JSON消息的呈现字段包含来自rustc的“简短”呈现。不能与human或short一起使用。json-diagnostic-rendered-ansi
: 确保JSON消息的呈现字段包含嵌入的ANSI颜色代码,以符合rustc的默认颜色方案。不能与human或short一起使用。json-render-diagnostics
: 指示Cargo不要在打印的JSON消息中包含rustc诊断,而是Cargo本身应该呈现来自rustc的JSON诊断。Cargo自己的JSON诊断和来自rustc的其他诊断仍然会发出。不能与human或short一起使用。
--build-plan
向stdout输出一系列JSON消息,指示运行构建的命令。此选项不稳定,仅在nightly channelhttps://doc.rust-lang.org/book/appendix-07-nightly-rust.html 可用,并且需要-Z unstable-options
标志才能启用。请参阅 https://github.com/rust-lang/cargo/issues/5579>了解更多信息。
Manifest 选项
--manifest-path path
Cargo.toml文件的路径。默认情况下,Cargo在当前目录或任何父目录中搜索Cargo.toml文件。--frozen
,--locked
这两个标志都要求Cargo.lock文件是最新的。如果锁文件丢失,或者需要更新,Cargo将出错退出。冻结标志还防止货物试图访问网络来确定它是否过期。
在希望断言Cargo.lock
文件是最新的(例如CI构建)或希望避免网络访问的环境中,可以使用这些文件。--offline
防止货物以任何理由访问网络。如果没有这个标志,当Cargo需要访问网络而网络不可用时,Cargo将出错停止。有了这个标志,如果可能的话,货物将试图在没有网络的情况下前进。
请注意,这可能会导致与在线模式不同的依赖关系解析。Cargo将自己限制在本地下载的板条箱中,即使在索引的本地副本中可能有更新的版本。请参阅cargo-fetch(1)命令,以便在脱机之前下载依赖项。
也可以用net.offline配置值来指定。https://doc.rust-lang.org/cargo/reference/config.html
Common 选项
+toolchain
如果cargo已经安装了rustup,并且Cargo的第一个参数以+开头,它将被解释为rustup工具链名称(例如+stable或+nightly)。请参见 rustup 文档 https://rust-lang.github.io/rustup/overrides.html 获取有关工具链覆盖如何工作的更多信息。--config KEY=VALUE or PATH
覆盖货物配置值。该参数应该采用KEY=VALUE
的TOML
语法,或者作为额外配置文件的路径提供。可以多次指定该标志。请参阅命令行覆盖部分https://doc.rust-lang.org/cargo/reference/config.html#command-line-overrides了解更多信息。-C PATH
- 在执行任何指定操作之前,更改当前工作目录。这将影响 cargo 在默认情况下在哪里查找项目清单(
Cargo.toml
),以及为了发现而搜索的目录。比如cargo/config.toml
。 - 此选项仅在 nightly channel 和 上可用,并且需要
-Z
不稳定选项标志才能启用 (见 https://github.com/rust-lang/cargo/issues/10098)。
-h, --help
打印帮助信息。-Z flag
Cargo不稳定 (nightly-only) 标志。运行cargo -Z help
获取详细信息。
Miscellaneous 选项
-j N, --jobs N
要运行的并行作业的数量。也可以用build.jobs配置值指定 https://doc.rust-lang.org/cargo/reference/config.html。 默认为逻辑CPU的数量。如果为负,它将并行作业的最大数量设置为逻辑CPU的数量加上提供的值。不应为0。--keep-going
在依赖图中构建尽可能多的crates
,而不是在第一个构建失败时中止构建。不稳定,需要 ·-Zunstable-options·。--future-incompat-report
显示在执行此命令期间产生的任何未来不兼容警告的未来不兼容报告。
4.2 Rust 语言的编译器: rustc
工具
另外一个重要的工具就是 rustc
了,它是 Rust 语言的编译器。不过大多数Rust程序员不直接调用 rustc
,而是通过Cargo命令来实现——只是需要指出,这背后都是为rustc
服务的!
4.2.1 rustc 命令行语法格式
rustup.exe
提供以下命令语法格式
rustc [OPTIONS] INPUT
4.2.2 rustc 命令参数与选项解析
该命令具有以下选项:
-h
,--help
显示此消息
--cfg SPEC
配置编译环境
-L [KIND=]PATH
将目录添加到库搜索路径。可选类型可以是dependency
、crate
、native
、framework
或all
(默认)中的一种。-l [KIND[:MODIFIERS]=]NAME[:RENAME]
将生成的 crate(s) 链接到指定的本地库名称。可选类型可以是static
、framework
或dylib
(默认值)之一。可选的逗号分隔修饰符 (bundle
|verbatim
|whole-archive
|as-needed
) 可以用前缀+
来指定,以启用或-
来禁用。
--crate-type [bin|lib|rlib|dylib|cdylib|staticlib|proc-macro]
编译器要发出的以逗号分隔的 crates 类型列表--crate-name NAME
指定正在构建的 crate 的名称--edition 2015|2018|2021|2024
指定编译代码时要使用的编译器版本。默认为2015年,最新稳定版为2021年。--emit [asm|llvm-bc|llvm-ir|obj|metadata|link|dep-info|mir]
编译器要发出的输出类型的逗号分隔列表--print [crate-name|file-names|sysroot|target-libdir|cfg|calling-conventions|target-list|target-cpus|target-features|relocation-models|code-models|tls-models|target-spec-json|native-static-libs|stack-protector-strategies|link-args]
要在stdout上打印的编译器信息
-g
相当于-C debuginfo=2
-O
相当于-C opt-level=2
-o FILENAME
将输出写入
--out-dir DIR
将输出写入编译器在中选择的文件名--explain OPT
提供错误消息的详细解释--test
构建测试工具--target TARGET
为其编译代码的目标三元组
-A
,--allow LINT
设置 lint 允许-W
,--warn LINT
设置 lint 警告信息--force-warn LINT
设置 lint 强制警告-D
,--deny LINT
设置lint拒绝-F
,--forbid LINT
禁止lint设置
--cap-lints LEVEL
设置最严格的lint 等级。更具限制性的lints被限制在这一级别
-C
,--codegen OPT[=VALUE]
设置codegen选项-V
,--version
打印版本信息并退出-v
,--verbose
使用详细输出
其他帮助选项:
-C
help
打印代码生成选项-W
help
打印“lint”选项和默认设置--help
-v
打印 rustc 接受的全套选项