cratosw

编译与构建

编译与构建

.NET CLI

Rust 中最接近 .NET CLI(dotnet)的工具是 Cargocargo)。 两者都像“统一入口”,把底层编译/构建能力封装成更易用的命令。

例如在 .NET 里,虽然可以直接调用 cscdotnet msbuild,但实践中更常用 dotnet build。Rust 也是类似:虽然可直接调用 rustc,但通常使用 cargo build 更高效。

构建

在 .NET 中,使用 dotnet build 构建可执行程序时,会先还原依赖, 再编译为 assembly(IL)。该产物通常可跨平台运行(前提是目标机器安装了 .NET 运行时), 并且依赖程序集通常与主程序集共同输出。

在 Rust 中,cargo build 也会执行构建流程,但默认会把代码 静态链接(亦存在其他 linkage options)为单个“平台相关”的二进制文件。

.NET 常通过 dotnet publish 做发布准备,支持 FDD/SCD。Rust 没有完全对应 dotnet publish 的命令语义,因为每个目标平台的构建结果本身通常已是可分发二进制。

构建库时,.NET 依旧输出 IL 程序集;Rust 则输出针对目标平台编译后的库产物。

另见:

依赖管理

在 .NET 中,项目文件定义构建选项与依赖。Rust 使用 Cargo 时,由 Cargo.toml 声明包信息与依赖。

一个典型 .csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="morelinq" Version="3.3.2" />
  </ItemGroup>

</Project>

对应的 Cargo.toml

[package]
name = "hello_world"
version = "0.1.0"

[dependencies]
tokio = "1.0.0"

Cargo 默认约定:

  • src/main.rs 是与包同名的二进制 crate 根
  • src/lib.rs 表示该包同时包含同名库 crate

.NET 生态最常用 NuGet。比如用 .NET CLI 添加依赖:

dotnet add package morelinq

Rust 中可用 Cargo 添加依赖:

cargo add tokio

.NET 常见包源是 nuget.org,Rust 常见包源是 crates.io

静态代码分析

从 .NET 5 起,Roslyn 分析器已随 SDK 提供,可做代码质量和风格检查。 Rust 对应工具是 Clippy

和 .NET 通过 TreatWarningsAsErrors 把警告视为错误类似, Rust 可通过 cargo clippy -- -D warnings 在有警告时直接失败。

Rust CI 中还常见的静态检查:

On this page