大道至简乐逍遥 發表於 2025-2-5 09:18:06

Rust 中的 Packages 与 Crates模块化构建的基础及开发流程

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>什么是 Crate?</li><ul class="second_class_ul"><li>二进制 Crate 与 库 Crate</li><li>Crate Root</li></ul><li>什么是 Package?</li><ul class="second_class_ul"></ul><li>Package 与 Crate 的关系</li><ul class="second_class_ul"></ul><li>小结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>什么是 Crate?</h2>
<p>在 Rust 中,一个 <strong>crate</strong> 是编译器在编译时所考虑的最小代码单元。无论是通过 <code>rustc</code> 编译一个单独的源文件,还是使用 Cargo 构建整个项目,Rust 都会把输入的源文件当作一个 crate。一个 crate 可以包含多个模块,而这些模块又可以分散在不同的文件中。</p>
<p class="maodian"></p><h3>二进制 Crate 与 库 Crate</h3>
<p>Rust 中的 crate 分为两种形式:</p>
<ul><li><strong>二进制 Crate</strong></li></ul>
<p>二进制 crate 生成可执行文件。每个二进制 crate 都必须包含一个名为 <code>main</code> 的函数作为程序的入口点。例如,我们在前几章编写的命令行程序都是二进制 crate。</p>
<ul><li><strong>库 Crate</strong></li></ul>
<p>库 crate 不包含 <code>main</code> 函数,也不会编译成可执行文件。它们主要用于定义可以在多个项目间共享的功能。例如,常用的 <code>rand</code> 库提供了生成随机数的功能。通常 Rustaceans 在提到 &ldquo;crate&rdquo; 时,多数情况下指的是库 crate,二者在概念上可视为库或模块化的 API。</p>
<p class="maodian"></p><h3>Crate Root</h3>
<p>每个 crate 都有一个 <strong>crate root</strong>,即编译器开始编译时首先查找的源文件。对于二进制 crate,Cargo 默认将 <code>src/main.rs</code> 作为 crate root;而对于库 crate,默认的 crate root 是 <code>src/lib.rs</code>。</p>
<p class="maodian"></p><h2>什么是 Package?</h2>
<p>一个 <strong>package</strong> 则是包含一个或多个 crate 的代码集合。每个 package 都包含一个 <code>Cargo.toml</code> 文件,该文件描述了如何构建 package 中的所有 crate。简单来说,package 是 Cargo 用来管理和构建多个 crate 的单位。</p>
<p>例如,当你执行以下命令创建一个新项目时:</p>
<div class="jb51code"><pre class="brush:bash;">$ cargo new my-project
   Created binary (application) `my-project` package</pre></div>
<p>这时,Cargo 会为你生成如下目录结构:</p>
<div class="jb51code"><pre class="brush:plain;">my-project/
├── Cargo.toml
└── src
    └── main.rs</pre></div>
<p>在这个例子中,<code>Cargo.toml</code> 定义了 package,而 <code>src/main.rs</code> 则是一个二进制 crate 的 crate root。注意:Cargo 会自动按照约定将 <code>src/main.rs</code> 视为与 package 同名的二进制 crate。如果你的 package 中既有 <code>src/main.rs</code> 又有 <code>src/lib.rs</code>,那么该 package 同时包含一个二进制 crate和一个库 crate。</p>
<p>此外,你还可以通过在 <code>src/bin</code> 目录中放置额外的文件来创建多个二进制 crate。每个文件都会被编译成一个独立的可执行文件,这为需要构建多个工具或命令行程序的项目提供了极大的灵活性。</p>
<p class="maodian"></p><h2>Package 与 Crate 的关系</h2>
<ul><li><strong>Package</strong>:是一个包含一个或多个 crate 的集合,包含一个 <code>Cargo.toml</code> 文件来描述项目的元数据和构建配置。</li><li><strong>Crate</strong>:是编译器处理的最小单元,分为二进制 crate 和库 crate。每个 package 至少包含一个 crate,但可以包含多个二进制 crate(放在 <code>src/bin</code> 下),同时只能包含一个库 crate。</li></ul>
<p>这种设计使得 Rust 在组织和管理代码时非常灵活,既能让你将功能拆分为独立的 crate,又能通过 package 将相关的 crate 组合在一起进行统一管理。</p>
<p class="maodian"></p><h2>小结</h2>
<ul><li><strong>Crate</strong> 是 Rust 编译器处理的最小代码单元,可以是二进制或库。</li><li><strong>Crate Root</strong> 是每个 crate 的入口文件,二进制 crate 默认是 <code>src/main.rs</code>,库 crate 默认是 <code>src/lib.rs</code>。</li><li><strong>Package</strong> 是一个包含一个或多个 crate 的集合,Cargo 通过 <code>Cargo.toml</code> 管理 package 的元数据和构建配置。</li><li>一个 package 可以包含多个二进制 crate(通过 <code>src/bin</code> 目录),但至多只能包含一个库 crate。</li></ul>
<p>掌握了这些基本概念后,你就能更好地理解 Rust 的模块系统,并利用 Cargo 高效地管理你的项目。无论是构建一个简单的命令行工具,还是开发一个庞大的库项目,正确的包和 crate 结构都是成功的关键。</p>
<p>希望这篇博客能帮助你更清晰地理解 Rust 中的 Packages 与 Crates 概念,开启你高效模块化开发的旅程。Happy coding!</p>
<p>到此这篇关于Rust 中的 Packages 与 Crates:模块化构建的基础的文章就介绍到这了,更多相关Rust Packages 与 Crates内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Rust 中的 Packages 与 Crates模块化构建的基础及开发流程