chap 12 Cargo 语法与属性

 

cargo 的语法和属性

cargo 的语法和属性

  • 以管理项目的依赖关系
    • 创建项目
      • 二进制可执行文件:cargo new foo
        • 项目层级结构
          • foo/
            • Cargo.toml:项目配置文件(可用可用配置选项列在 格式规范 中)
              • [package]
                • name = "foo"
                  • 项目的名称,发布 crate 后在crates.io 中名称;
                  • 也是二进制可执行文件的名称
                • version = "0.1.0"
                • authors = ["mark"]
              • [dependencies]:项目的依赖项
                • clap = "2.27.1" :项目引入来自 crates.io 的包
                • rand = { git = "https://github.com/rust-lang-nursery/rand" }引入github的包
                • bar = { path = "../bar" }:引入本地包
            • src/
              • main.rs
                • extern crate clap:在程序中引入clap的Rust包
      • 库:cargo new --lib foo
    • 构建项目
      • 在项目目录中的任何位置(包括子目录!)执行 cargo build
      • cargo run 来构建和运行
  • 约定规范
    • 添加其他二进制可执行文件:将文件放在 bin/ 目录中
      • 项目层级结构
        • foo/
          • Cargo.toml
        • src/
          • main.rs
          • bin/
            • other_bin.rs <– cargo run --bin other_bin
      • cargo编译或运行other_bin.rs
        • cargo build --bin other_bin
  • 测试
    • 《Rust 程序设计语言》:测试的章节
    • 如何编写测试
      • 测试函数体
        1. 设置任何所需的数据或状态
        2. 运行需要测试的代码
        3. 断定其期望的结果
      • 测试就是一个函数(带有 test 属性注解)
        • 属性(attribute)是关于 Rust 代码片段的元数据
        • #[test] fn tests_func() {assert_eq!(2+2, 4);}
    • 测试项目层次结构
      • foo/
        • Cargo.toml
        • src/
          • main.rs
        • test/:每个文件是单独的集成测试
          • my_test.rs
          • my_other_test.rs
      • 测试运行命令
        • cargo test:测试所有测试模块
        • cargo test test_foo:测试一个模块
      • cargo 多项测试是并行的,确保它们不会相互竞争(它们都输出到文件,则应该将它们写入不同的文件)
    • 构建脚本
      • 定义
        • 只是另一个 Rust 文件
        • 在编译包中的任何其他内容之前,优先进行编译和调用
        • 构建脚本可以使用此处指定的环境变量
      • 特点
        • 通过 stdout (标准输出)提供输出
        • 打印的所有行都写入到 target/debug/build/<pkg>/output
        • cargo: 为前缀的行将由 cargo 直接解析,因此可用于定义包编译的参数
      • Cargo.toml 中指定
        • [packages]
          • build = "build.rs"
          • 解决在 cargo 成功编译之前需要的一些先决条件
            • 代码生成/需要编译的一些本地代码
      • cargo 将在项目目录中优先查找 build.rs 文件

chap13 属性

  • 属性是应用于某些模块、crate 或项的元数据(metadata)
  • 语法
    • 属性应用范围
      • 整个 crate#![crate_attribute]
      • 模块或项:#[item_attribute]`
    • 接受参数的形式
      • #[attribute = "value"]
      • #[attribute(key = "value")]
      • #[attribute(value)]
    • 多参数
      • #[attribute(value, value2, value3, ...)]
  • 死代码 dead_code
    • 对某个函数禁用死代码警告 lint 的属性
      • #[allow(dead_code)]
    • 在实际程序中,需要将死代码清除掉
  • crate相关属性
    • crate_type:告知编译器 crate 是二进制的可执行文件还是库
      • #![crate_type = "lib"]
    • crate_name :设定 crate 的名称
      • #![crate_name = "rary"]
      • 使用rustc 命令不再需要给加上 --crate-type 标记
    • 使用 cargo 时,这两种类型时都没有作用
  • cfg 条件编译
    • 语法
      • cfg 属性:在属性位置中使用 #[cfg(...)]
        • #[cfg(target_os = "linux")] fn a(){...}
          • 函数仅当目标系统 Linux 的时候才会编译
        • #[cfg(not(target_os = "linux"))]
          • 仅当目标系统 不是 Linux 时才会编译
      • cfg! 宏:在布尔表达式中使用 cfg!(...)
        • if cfg!(target_os = "linux") { print!("linux")
        • else print!("not linux")
      • target_os 是由 rustc 隐式地提供的
  • 自定义条件
    • 使用 --cfg 标记来传给 rustc
    • 示例
      • #[cfg(some_condition)] fn cond_func() {...}
      • rustc --cfg some_condition custom.rs