Rust中Cargo的使用详解

目录
  • 1、cargo简介
  • 2、使用cargo创建项目
    • 2.1、关于Cargo.toml
    • 2.2 、关于src/main.rs
  • 3、构建Cargo项目
  • 4、构建并运行Cargo项目
  • 5、检查代码是否可编译
  • 6、发布(release)构建
  • 7、把Cargo当作习惯
  • 8、总结

1、cargo简介

Cargo 是 Rust 的构建系统和包管理器。⼤多数 Rustacean 们使⽤ Cargo 来管理他们的 Rust 项⽬,因为它可以为你处理很多任务,⽐如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖(dependencies))。

查看cargo版本

cargo --version

我这里可以看到具体的版本好和日期

cargo 1.63.0 (fd9c4297c 2022-07-01)

2、使用cargo创建项目

cargo new hello_cargo
cd hello_cargo

第一行命令,创建了一个名为hello_cargo的目录和项目。

进入目录可以看到以下目录:

|-src
| |-main.rs
|-.gitignore
|-Cargo.toml

2.1、关于Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
  • 第一行,[package], 是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)接踵而至的3行设置了Cargo编译程序所需要的配置:name(项目名称)、version(项目的版本)、edition(使用的Rust版本)
  • 最后一行,[dependcies], 是罗列项目依赖的片段的开始,在Rust中,代码包被称为crates。当然在这个项目我们并不需要其他的crate,不过后面我们会用到这个片段。

2.2 、关于src/main.rs

fn main() {
    println!("Hello, world!")
}

​ Cargo为我们自动生成一个“Hello,world!” 程序,正如我们之前编写的示例helloWorld一样,不同的是它将main.rs文件放到了src目录下面。

​ Cargo 期望源文件存放在src目录中。项目根目录只存放 README、license信息、配置文件和其他跟代码无关的文件。使用Cargo帮助你保持项目干净整洁,一切井井有条。

​ 当然如果没有使用Cargo创建的项目,我们也可以转化为一个Cargo项目,比如我之前的HelloWorld项目。我们可以新建目录src、新建源文件main.rs在src目录下、以及创建一个合适的Cargo.toml 文件。

3、构建Cargo项目

我们现在已经使用Cargo创建好了hello_cargo项目,现在我们进入项目目录

cd hello_cargo

然后我们可以使用Cargo中的build命令开始构建项目

cargo build

执行命令后,会打印出如下结果:

Compiling hello_cargo v0.1.0 (D:\RustLang\RustWorkSpace\hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 1.09s

到这里我们首次运行cargo build成功,你会发现此时项目目录中多出了一个target目录和Cargo.lock文件。

这和前端打包类似,如执行npm run build 命令后npm会默认生成一个dist目录,里面就是源码代码经过编译和压缩后可以放在服务器运行的网页页面。其中生成的Cargo.lock文件也和package-lock.json类似,不用说Cargo.toml和package.json 对应。

最后我们可以运行构建成功后生成的可执行文件

.\target\debug\hello_cargo.exe

如果一切顺利,终端上应该打印出Hello,world!

由于默认的构建⽅法是调试构建(debug build),Cargo 会将可执⾏⽂件放在名为 debug 的⽬录中。

4、构建并运行Cargo项目

​ 在认识了cargo build命令,我们知道它是用来构建Cargo项目的,但是运行项目需要我们自己去target目录里面去找到可执行文件,并执行它。

​ 接下来我们来认识一个新的命令cargo run 。它可以构建并运行构建后的可执行文件。

cargo run

打印结果:

Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target\debug\hello_cargo.exe`
Hello, world!

​ 相信到了这里,我们心中一定明白这个命令,今后会是我们的长期合作伙伴,魂牵梦萦那种。

​ 当然有必要说明一下,因为之前我们已经使用cargo build 命令构建了hello_cargo项目 , 所以此时执行的 cargo run 命令并没有重新编译,而是直接运行了可执行文件,打印出了Hello,world!

​ 接下来我们看看,改变了源文件在执行该命令会是什么结果:

Compiling hello_cargo v0.1.0 (D:\RustLang\RustWorkSpace\hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.63s
     Running `target\debug\hello_cargo.exe`
Hello, Rust world!

​ 这里我们看到结果里面有CompilingFinishedRunning 字样,所以我们知道这次它重新编译了该项目,并执行了可执行文件,打印出了新的结果:Hello, Rust world!

5、检查代码是否可编译

​ 接下来我们认识应该新的命令cargo check , 该命令可以快速检查代码确保可以编译,但并不产生可执行文件:

Checking hello_cargo v0.1.0 D:\RustLang\RustWorkSpace\hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.07s

如果一切顺利控制台会出现以上结果。

​ 到了这里可能有人会问,为什么不直接执行 cargo buildcargo run 命令呢?这样还可以直接生成可执行文件,多方便。

对于一个合格的新时代农民,我们应该持续定期去检查我们的“庄稼”,让它们可以健康成长,这样我们才可以迎来大丰收。不然我们可能会饿肚子!

​ 所以我们要习惯使用cargo check 定期检查我们的代码是否可编译,避免不必要的后顾之忧。

6、发布(release)构建

​ 当项⽬最终准备好发布时,可以使⽤ cargo build --release 来优化编译项⽬。这会在target/release ⽽不是 target/debug 下⽣成可执⾏⽂件。这些优化可以让 Rust 代码运⾏的更快,不过启⽤这些优化也需要消耗更⻓的编译时间。这也就是为什么会有两种不同的配置:⼀种是为了开发,你需要经常快速重新构建;另⼀种是为⽤户构建最终程序,它们不会经常重新构建,并且希望程序运⾏得越快越好。如果你在测试代码的运⾏时间,请确保运⾏ cargo build --release 并使⽤ target/release 下的可执⾏⽂件进⾏测试。

​ 对于运行发行版本我们可以使用 cargo run --release 命令

 Finished release [optimized] target(s) in 0.01s
     Running `target\release\hello_cargo.exe`
Hello, Rust world!

7、把Cargo当作习惯

​ 对于简单项目,Cargo并不比rustc提供了更多的优势,不过随着开发深入,最终会证明它的价值,⼀旦程序壮⼤到由多个⽂件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。

​ 即便 hello_cargo 项⽬⼗分简单,它现在也使⽤了很多在你之后的 Rust ⽣涯将会⽤到的实⽤⼯具。其实,要在任何已存在的项⽬上⼯作时,可以使⽤如下命令通过 Git 检出代码,移动到该项⽬⽬录并构建:

git clone example.com/test_project
cd test_project
cargo build

了解更多关于Cargo可以查阅Cargo相关文档

8、总结

本章我们学习了Cargo的相关内容:

  • 使用 cargo new 创建项目
  • 使用 cargo build 构建项目
  • 使用 cargo run 一步构建并运行项目
  • 使用 cargo check 在不生成二进制文件的情况下检查项目是否可编译
  • 使用 cargo build --release 构建项目发行版本
  • 使用 cargo run --release 运行发行版本,可测试发布版本的运行时间

使⽤ Cargo 的⼀个额外的优点是,不管你使⽤什么操作系统,其命令都是⼀样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。

到此这篇关于Rust中Cargo的使用的文章就介绍到这了,更多相关Rust Cargo的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Rust中的Cargo构建、运行、调试

    目录 基本概念 Cargo相关命令 创建工程目录说明 VSCode 中配置 Rust工程 基本概念 Cargo是rustup安装后自带的,Cargo 是 Rust 的构建系统和包管理器.Rust 开发者常用 Cargo 来管理 Rust 工程和获取工程所依赖的库.入门教程中使用 cargo new helloworld 命令创建了一个名为 helloworld 的工程,Cargo 新建了一个名为 helloworld 的文件夹并在里面部署了一个 Rust 工程最典型的文件结构.这个 hellow

  • 使用Cargo工具高效创建Rust项目

    目录 前言 一.功能强大的Cargo工具 1.Cargo工具是什么? 2.使用Cargo命令创建 hello_cargo 项目 3.项目文件目录里各文件的内容和特点 4.Cargo 常用命令 二.Rust 语言的输入输出 1.输入输出测试 2.具体代码解析 前言 本文紧跟上篇Rust博文内容,讲解Cargo工具在Rust项目创建时的妙用,手把手教你使用Cargo工具在黑窗口创建项目.此外,创建项目之后,简单的做一个Rust语言中输入输出的测试,上文提到学好Rust语言的方法就是一步一步打基础,因

  • Rust中Cargo的使用详解

    目录 1.cargo简介 2.使用cargo创建项目 2.1.关于Cargo.toml 2.2 .关于src/main.rs 3.构建Cargo项目 4.构建并运行Cargo项目 5.检查代码是否可编译 6.发布(release)构建 7.把Cargo当作习惯 8.总结 1.cargo简介 Cargo 是 Rust 的构建系统和包管理器.⼤多数 Rustacean 们使⽤ Cargo 来管理他们的 Rust 项⽬,因为它可以为你处理很多任务,⽐如构建代码.下载依赖库并编译这些库.(我们把代码所需

  • Rust 编程语言中的所有权ownership详解

    目录 I. 前言 II. Rust Ownership概述 III. Ownership的代码实践 IV. Ownership与内存管理 首先和c++相比 和我们熟悉的jvm垃圾回收相比 V. 总结 I. 前言 Rust,不少程序员的白月光,这里我们简单罗列一些大牛的评价. Linus Torvalds:Linux内核的创始人,对Rust的评价是:“Rust的主要优点是代码的安全性和速度,很难在C++中实现这种安全性,而且Rust编译器会捕获很多C++难以发现的错误”. Brian Kernig

  • Rust实现AES加解密详解

    目录 一.选择使用 rust-crypto 二.Cargo.toml 文件 三.工具类 1.加密 2.解密 3.测试样例 一.选择使用 rust-crypto rust-crypto 官方相关站点 crates.io https://crates.io/crates/rust-crypto repository https://github.com/DaGenix/rust-crypto documentation (以0.2.36为例) https://docs.rs/rust-crypto/

  • Angularjs中数据绑定的实例详解

    Angularjs中数据绑定的实例详解 这是一个最简单的angularjs的例子,关于数据绑定的,大家可以执行一下,看看效果 <html ng-app> <head> <title>angularjs-include</title> <script type="text/javascript" src="js/angular/angular.min.js"></script> </head

  • 基于angular中的重要指令详解($eval,$parse和$compile)

    在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者就有100个哈姆雷特,我在这里讲讲自己对于他们两个服务的理解. 大家可能会疑问,$eval呢,其实他并不是一个服务,他是scope里面的一个方法,并不能算服务,而且它也基于parse的,所以只能算是$parse的另一种写法而已,我们看一下ng源码中$eval的定义是怎样的就知道了 $eval: fu

  • python中 logging的使用详解

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息,通常仅在诊断问题时才受到关注.整数level=10 INFO: 确认程序按预期工作.整数level=20 WARNING:出现了异常,但是不影响正常工作.整数level=30 ERROR:由于某些原因,程序 不能执行某些功能.整数level=40 CRITICAL:严重的错误,导致程序不能运行.整数

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. 1. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_va

  • 基于C++中setiosflags()的用法详解

    cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2); setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执行由有参数指定区域内的动作:   iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧:   iso::right 也是se

  • JSP Spring配置文件中传值的实例详解

    JSP Spring配置文件中传值的实例详解 通过spring提供方法,在配置文件中取传值 调用get方法  targetObject :指定调用的对象       propertyPath:指定调用那个getter方法 例1: public class Test1 { private String name = "nihao"; public String getName() { return name; } } Xml代码 <bean id="t1" cl

随机推荐