• rust cargo


    一、cargo是什么

    Cargo是Rust的构建工具和包管理器。
    Cargo除了创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。
    真正编写程序时,我们不直接用rustc,而是用cargo。

    二、使用cargo

    (一)使用Cargo创建项目
    回到projects目录。运行以下命令:

    $ cargo new hello_cargo
    $ cd hello_cargo
    
    • 1
    • 2

    cargo new命令新建了名为hello_cargo的目录。
    目录结构如下

    $ tree .
    ├── .git
    ├── .gitignore
    ├──Cargo.toml
    └──src
        └──main.rs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    源文件存放在src目录中。
    项目根目录只存放README、license信息、配置文件和其他跟代码无关的文件。

    现在打开src/main.rs看看:

    fn main() {
         println!("Hello, world!");
    }
    
    • 1
    • 2
    • 3

    (二)构建并运行Cargo项目
    1.使用cargo build
    在hello_cargo目录下,输入下面的命令来构建项目:

    $ cargo build
    
    • 1

    这个命令会创建一个可执行文件target/debug/hello_cargo。由于默认的构建方法是调试构建(debug build),Cargo会将可执行文件放在名为debug的目录中。

    运行可执行文件:

    $ ./target/debug/hello_cargo
    
    • 1

    2.使用cargo run
    可以使用cargo run在一个命令中同时编译并运行生成的可执行文件:

    $ cargo run
    
    • 1

    使用cargo run方便得多,所以大多数开发者会使用cargo run。

    3.使用cargo check
    该命令快速检查代码确保其可以编译,但并不产生可执行文件:

    $ cargo check
    
    • 1

    为什么不需要可执行文件呢?因为只是检查错误,不必生成可执行文件,用cargo check要比cargo build快得多。

    (三)发布(release)
    可以使用cargo build --release来发布项目。这会在target/release而不是target/debug下生成可执行文件。
    这可以让Rust代码运行的更快,不过也需要消耗更长的编译时间。
    这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。

    (四)Cargo.toml文件
    像下面这样:

    [package]
    name = "hello_cargo"
    version = "0.1.0"
    edition = "2021"
    [dependencies]
    regex = "0.1.41"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这个文件使用TOML (Tom’s Obvious, Minimal Language) 格式,这是Cargo配置文件的格式。
    [package],是包片段,表明下面的语句用来配置包。
    接下来的三行是包的名称、包的版本、使用的Rust版本。
    [dependencies],是依赖片段。表明下面语句都是需要的依赖。

    在Cargo.toml文件中添加依赖之后,Cargo会获取依赖以及依赖的依赖,编译并生成 Cargo.lock,Cargo.lock中包含了所有依赖的版本信息。未来就算regexp的作者升级了该包,我们依然会下载Cargo.lock中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会因为更新导致无法编译。当然,你还可以使用cargo update来手动更新包的版本

    有三种添加依赖的方法:
    1.添加官方仓库的依赖
    指定版本号
    例子

    rand = "0.3"
    hammer = { version = "0.5.0"}
    
    • 1
    • 2

    版本号符合 “x.y.z” 的形式,其中x称为主版本major, y称为小版本minor,而z称为补丁patch,从左到右,版本的影响范围逐步降低

    ^ 指定版本
    与 “x.y.z” 不同, ^ 可以指定一个版本号范围,然后会使用该范围内的最大版本号。

    ^1.2.3 := >=1.2.3, <2.0.0
    ^1.2 := >=1.2.0, <2.0.0
    ^1 := >=1.0.0, <2.0.0
    
    • 1
    • 2
    • 3

    ~ 指定版本
    ~ 使用该范围内的最小版本号 :

    ~1.2.3 := >=1.2.3, <1.3.0
    ~1.2 := >=1.2.0, <1.3.0
    ~1 := >=1.0.0, <2.0.0
    
    • 1
    • 2
    • 3

    * 通配符
    这种方式允许将 * 所在的位置替换成任何数字:

    * := >=0.0.0
    1.* := >=1.0.0, <2.0.0
    1.2.* := >=1.2.0, <1.3.0
    
    • 1
    • 2
    • 3

    不过crates.io并不允许我们只使用孤零零一个 * 来指定版本号 : *。

    比较符
    可以使用比较符指定一个版本号范围:

    >= 1.2.0
    > 1
    < 2
    = 1.2.3
    
    • 1
    • 2
    • 3
    • 4

    同时还能组合比较符,并通过逗号分隔:

    >= 1.2, < 1.5
    
    • 1

    2.添加第三方仓库的依赖
    指定git仓库地址
    例子

    color = { git = "https://github.com/bjz/color-rs" }
    
    • 1

    由于没有指定版本,Cargo会假定我们使用main分支的最新commit。
    你可以使用rev、tag或branch来指定想要拉取的版本。例如下面代码拉取了next分支上的最新commit:

    [dependencies]
    regex = { git = "https://github.com/rust-lang/regex", branch = "next" }
    
    • 1
    • 2

    任何非tag和branch的类型都可以通过rev来引入,例如通过最近一次commit的哈希值引入: rev = “4c59b707”,再比如远程仓库提供的的具名引用: rev = "refs/pull/493/head"

    3.添加本地的依赖
    指定绝对路径或者相对路径
    例子

    geometry = { path = "crates/geometry" }
    
    • 1

    一般来说,本地依赖包都是同一个项目内的内部包,例如假设我们有一个 hello_world 项目,现在在其根目录下新建一个包:

    # 在hello_world/ 目录下
    $ cargo new hello_utils
    
    • 1
    • 2

    新建的 hello_utils 文件夹跟 src、Cargo.toml同级,现在修改Cargo.toml让hello_world项目引入新建的包:

    [dependencies]
    hello_utils = { path = "hello_utils" }
    # 以下路径也可以
    # hello_utils = { path = "./hello_utils" }
    # hello_utils = { path = "../hello_world/hello_utils" }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、配置cargo

    官方仓库的地址默认是crates.io,是由Rust官方提供的,国内访问不了。
    可以修改为国内的镜像地址。

    cargo配置文件为
    在Windows系统默认为:%USERPROFILE%\.cargo\config
    在linux系统默认为:$HOME/.cargo/config

    在配置文件里添加如下代码

    [source.crates-io]
    replace-with = 'ustc'
    [source.ustc]
    registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
    
    • 1
    • 2
    • 3
    • 4

    注意,cargo search无法使用镜像。

  • 相关阅读:
    JavaScript算法43- 分类求和并作差(leetCode:100103easy)周赛
    memmove内存拷贝函数
    【深度学习实验】卷积神经网络(一):卷积运算及其Pytorch实现(一维卷积:窄卷积、宽卷积、等宽卷积;二维卷积)
    http概念
    人工智能 绪论
    Python Day2 爬虫基础操作【初级】
    计算机系统中丢失MSVCR100.dll的解决方法,三个方法快速搞定
    Linux:1.进程介绍+2.Linux父子进程+3.终止进程kill和killall+4.查看进程树pstree+5.service服务管理
    【新】致远OA从前台XXE到RCE漏洞分析
    使用VueCli快速搭建项目
  • 原文地址:https://blog.csdn.net/inxunxun/article/details/133545603