Rust Package
Table of Contents
1. Rust Package
1.1. Overview
- package 指最顶层的 cargo porject
- 一个 package 可以包含多个 crate, 每个 crate 包含一个对应的 Cargo.toml
- 一个 crate 包含多个 mod, 并构成一棵 mod 树
/home/sunway/hello_rust/ ├── Cargo.lock ├── Cargo.toml ├── hello │ ├── Cargo.toml │ └── src │ ├── main.rs │ └── mod_one.rs └── util ├── Cargo.toml └── src ├── lib.rs ├── mod_three │ └── mod.rs └── mod_two.rs
1.2. package
hello_rust 是一个 package, 其 Cargo.toml 为:
[workspace] members = [ "hello", "util", ]
表示这个 package 包含两个 crate: hello 和 util
1.3. crate
hello 和 util 有其单独的 Cargo.toml, 其中 hello 是 bin, util 是 lib
bin 与 lib 的区别在于:
- bin 的入口是 src/main.rs
- lib 的入口是 src/lib.rs
hello/Cargo.toml:
[package] name = "hello" version = "0.1.0" authors = ["sunway <[email protected]>"] edition = "2018" [dependencies] util = {path="../util"}
util/Cargo.toml:
[package] name = "util" version = "0.1.0" authors = ["sunway <[email protected]>"] edition = "2018" [dependencies]
1.4. mod
每个 crate 定义的所有 mod 构成一个 mod 树. 定义 mod 有三种方法:
- 直接在 lib.rs 或 main.rs 中通过 mod foo {} 定义 foo mod
- 在 src/foo.rs 中定义 foo mod
- 在 src/foo/mod.rs 中定义 foo mod.
util/mod.rs:
pub mod mod_one { pub fn foo() { println!("{:?}", "foo of util::mod_one"); } } pub mod mod_two;
util/mod_two.rs:
pub fn foo() { println!("{:?}", "foo of util::mod_two"); }
mod_one 是 util 的子模块, 因为 mod_one 直接定义在 util.rs 中.
mod_two 也是 util 的子模块, 因为通过 mod mod_two, 可以把 mod_two `挂在` util 的下.
最终所有的 mod 通过需要通过上述两种方法加入 mod 树.
1.4.1. mod 使用
main.rs:
mod mod_one; fn foo() -> () { println!("{:?}", "foo of hello"); } mod mod_two { pub fn foo() -> () { println!("{:?}", "foo of mod_two"); print!(" -> "); // super::用来引用 parent mod super::foo(); } } fn main() { util::mod_one::foo(); util::mod_two::foo(); util::mod_three::foo(); foo(); crate::foo(); mod_one::foo(); crate::mod_one::foo(); mod_two::foo(); }
hello 这个 bin 有两个 crate 的 mod 可用:
- hello crate, 可以忽略或通过 `crate` 关键字访问
- util crate, 可以通过 `util` 访问
1.5. use
use 可以简单的看作是别名, 用来把上面的 util::mod_one::foo 简化为 foo
每段代码在 mod 树上都有确定的路径, use 时可以用 use crate_name::mod_name 这种绝对的形式, 也可以用相对于当前 mod 的形式,例如 use mod_one::foo.
另外, 对于 main.rs 和 lib.rs 中那些没有定义在特定 mod 中的代码, 可以直接通过 crate 名字来引用.
1.6. sample
base64 -d {} |tar jxvf -
QlpoOTFBWSZTWdBiLa8ABAb/z8aQAQBwd//f28ZxCv/v36pIAAIgAAsAAIAQAAhQA/50AItAADSm pkMmgGgyAAMgaDRkAAAG1DjJk0YhpoYCaGJo0yYgZGE0aaYQZMMmkaIoAAAAAAAAAAAA4yZNGIaa GAmhiaNMmIGRhNGmmEGTCJRAKYjTTFMGkRibUaMh6mNRkeoZGg2p5T4IH6ume31ylPbWxNZyDEO/ PBxQI/GqdVaEVJmEBdMQObl3bt3QaNEtutLa2YlwgXqVFlIJodCJvOSasBNPDECFRIsQBaCALCwY CyEUWgFAiGj5s+/W7UU5LIXVDq6Kp8ViQlfgYZNxg4lcaUgYUpYFQslmSBmFH4IEACqp09I5DCsP eWBl4wxU54PMe8egPCFuQe5LR7CUewKzONHeCmNG/ZgPH5yO8YHTjTioUbLdo5XDqIBw8hRpkOHS uVpIzPSglqhrZA2HlPpKoXJPP9CaU4zOYG8eDipo485Vs7CmHgtK1rSlFsLYFlhCPaaLgOBTR5RA 4PNUp5qCBemoL+m+1QOmCB1dW719c9nslK/jfT8/b7vGoOYQIgQQNTxa+GV+/VW2ymxLbPwcDFAi GEMY0121kBCuNmFZlTaX2llLPVvZBbBZhbjYgNUgB4TEAMGpIF2hEhKLQ6EJEAISahIrKYUMcUFJ yZUJADiVZ1aSYirJmEA0QcwqATENCmp0Vlsg9ySK1cqQaxihYmRIAgGpdjfdQsrCrcbg556abpWi dQ9YBU9ClsThQDlH0kOghgogRJq+gRgX656+mPrNLfMd88AbFQU0gAhMCzgYdZKeueQ5DsJZD2Am KB2pwhyB1h6lD0pzF2c7xQ7gO7H0F4H/bzsKBYaCojY5azSYGIWlYQk36EpT8u4MC9PKp8kDHW6m M7zsganIxOAeYzRkOUYGrzAbjaGBtO0zFU25GU6RpVfJtaAZEFhevQFTSay44jTQL9joFLM/IC5D nBdJrM5wX38Aa7m3xSsumwpmoVlSUZSVrcP8rmHQYBvDaBmLF3ChUDovJJKI2lY1GhJFDSI5DqOF xHuAzonQQx6Dj8IfZpdPq4iENpJJrPAgXOkyA2GZIWr4lpyJfQoUDlGQIQPHzAb4gaED5IHhO04c TbwCBib7keBOMoCQuHfbF0gYKh3IHegYmjZHMhz8Mkm+WhnFDnXlxBC6F6GIyXpZCd4xRf/F3JFO FCQ0GItrwA==