add manifest.md

pull/450/head
sunface 3 years ago
parent 2758ffbd26
commit ca5ab4c127

@ -138,14 +138,17 @@
- [进阶指南 doing](cargo/reference/intro.md)
- [指定依赖项](cargo/reference/specify-deps.md)
- [依赖覆盖](cargo/reference/deps-overriding.md)
- [Cargo.toml格式讲解 todo](cargo/reference/manifest/intro.md)
- [Cargo对象(Target) todo](cargo/reference/manifest/cargo-target.md)
- [Cargo.toml清单详解](cargo/reference/manifest.md)
- [Cargo对象(Target) todo](cargo/reference/cargo-target.md)
- [工作空间 todo](cargo/reference/workspaces.md)
- [features todo](cargo/reference/features.md)
- [编译器设置和优化 todo](cargo/reference/profiles.md)
- [发布配置profile todo](cargo/reference/profile.md)
- [配置管理 todo](cargo/reference/configuration.md)
- [环境变量 todo](cargo/reference/env.md)
- [构建脚本 todo](cargo/reference/build-script/intro.md)
- [构建脚本示例 todo](cargo/reference/build-script/examples.md)
- [发布到crates.io todo](cargo/reference/publishing-on-crates.io.md)
- [Package ID说明 todo](cargo/reference/package-id.md)
- [附录Git鉴权](cargo/git-auth.md)

@ -0,0 +1,82 @@
# Cargo.toml格式讲解
`Cargo.toml` 又被称为清单( `manifest` ),文件格式是 `TOML`,每一个清单文件都由以下部分组成:
* [`cargo-features`](unstable.md) — 只能用于 `nightly`版本的 `feature`
* [`[package]`](#package) — 定义项目( `package` )的元信息
* [`name`](#name) — 名称
* [`version`](#the-version-field) — 版本
* [`authors`](#the-authors-field) — 开发作者
* [`edition`](#the-edition-field) — Rust edition.
* [`rust-version`](#the-rust-version-field) — 支持的最小化 Rust 版本
* [`description`](#the-description-field) — 描述
* [`documentation`](#the-documentation-field) — 文档 URL
* [`readme`](#the-readme-field) — README 文件的路径
* [`homepage`](#the-homepage-field) - 主页 URL
* [`repository`](#the-repository-field) — 源代码仓库的 URL
* [`license`](#the-license-and-license-file-fields) — 开源协议 License.
* [`license-file`](#the-license-and-license-file-fields) — License 文件的路径.
* [`keywords`](#the-keywords-field) — 项目的关键词
* [`categories`](#the-categories-field) — 项目分类
* [`workspace`](#the-workspace-field) — 工作空间 workspace 的路径
* [`build`](#the-build-field) — 构建脚本的路径
* [`links`](#the-links-field) — 本地链接库的名称
* [`exclude`](#the-exclude-and-include-fields) — 发布时排除的文件
* [`include`](#the-exclude-and-include-fields) — 发布时包含的文件
* [`publish`](#the-publish-field) — 用于阻止项目的发布
* [`metadata`](#the-metadata-table) — 额外的信息,用于提供给外部工具
* [`default-run`](#the-default-run-field) — [`cargo run`] 所使用的默认可执行文件( binary )
* [`autobins`](cargo-targets.md#target-auto-discovery) — 禁止可执行文件的自动发现
* [`autoexamples`](cargo-targets.md#target-auto-discovery) — 禁止示例文件的自动发现
* [`autotests`](cargo-targets.md#target-auto-discovery) — 禁止测试文件的自动发现
* [`autobenches`](cargo-targets.md#target-auto-discovery) — 禁止 bench 文件的自动发现
* [`resolver`](resolver.md#resolver-versions) — 设置依赖解析器( dependency resolver)
* Cargo Target 列表: (查看 [Target 配置](cargo-target.md#Target配置) 获取详细设置)
* [`[lib]`](./cargo-target.md#library) — Library target 设置.
* [`[[bin]]`](cargo-target.md#binaries) — Binary target 设置.
* [`[[example]]`](cargo-target.md#examples) — Example target 设置.
* [`[[test]]`](cargo-target.md#tests) — Test target 设置.
* [`[[bench]]`](cargo-target.md#benchmarks) — Benchmark target 设置.
* Dependency tables:
* [`[dependencies]`](specify-deps.md) — 项目依赖包
* [`[dev-dependencies]`](specify-deps.md#dev-dependencies) — 用于 examples、tests 和 benchmarks 的依赖包
* [`[build-dependencies]`](specify-deps.md#build-dependencies) — 用于构建脚本的依赖包
* [`[target]`](specify-deps.md#根据平台引入依赖) — 平台特定的依赖包
* [`[badges]`](#the-badges-section) — 用于在注册服务(例如 crates.io ) 上显示项目的当前维护状态
* [`[features]`](features.md) — `features` 可以用于条件编译
* [`[patch]`](deps-overriding.md) — 推荐使用的依赖覆盖方式
* [`[replace]`](deps-overriding.md#不推荐的replace) — 不推荐使用的依赖覆盖方式 (deprecated).
* [`[profile]`](profiles.md) — 编译器设置和优化
* [`[workspace]`](workspaces.md) — 工作空间的定义
下面,我们将对其中一些部分进行详细讲解。
## [package]
`Cargo.toml` 中第一个部分就是 `package`,用于设置项目的相关信息:
```toml
[package]
name = "hello_world" # the name of the package
version = "0.1.0" # the current version, obeying semver
authors = ["Alice <a@example.com>", "Bob <b@example.com>"]
```
其中,只有 `name``version` 字段是**必须填写的**。当发布到注册服务时,可能会有额外的字段要求,具体参见[发布到crates.io](publishing-on-crates.io.md)。
#### name
项目名用于引用一个项目( `package` ),它有几个用途:
- 其它项目引用我们的 `package` 时,会使用该 `name`
- 编译出的可执行文件(bin target)的默认名称
`name` 只能使用 [`alphanumeric`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_alphanumeric) 字符、 `-``_`,并且不能为空。
事实上,`name` 的限制不止如此,例如:
- **当使用 `cargo new``cargo init` 创建时**`name` 还会被施加额外的限制例如不能使用Rust 关键字名称作为 `name`
- **如果要发布到 `crates.io` ,那还有更多的限制**: `name` 使用 `ASCII` 码,不能使用已经被使用的名称,例如 `uuid` 已经在 `crates.io` 上被使用,因此我们只能使用类如 `uuid_v1` 的名称,才能将项目发布到 `crates.io`
#### version
Cargo 使用了[语义化版本控制](https://semver.org)的概念,例如字符串 `"0.1.12"` 是一个 `semver` 格式的版本号,符合 `"x.y.z"` 的形式,其中 `x` 被称为主版本(major), `y` 被称为小版本 `minor` ,而 `z` 被称为 补丁 `patch`,可以看出从左到右,版本的影响范围逐步降低,补丁的更新是无关痛痒的,并不会造成 API 的兼容性被破坏。
使用该规则,你还需要遵循一些基本规则:
- 在版本到达 `1.0.0` 之前,怎么都行,但是如果有破坏性变更( breaking changes ),需要增加 `minor` 版本号。例如,为结构体新增字段或为枚举新增成员就是一种破坏性变更

@ -1 +0,0 @@
# Cargo.toml格式讲解

@ -252,7 +252,7 @@ mio = "0.0.1"
> 注意,当发布包到 crates.io 时,`[dev-dependencies]` 中的依赖只有指定了 `version` 的才会被包含在发布包中。况且,再加上测试稳定性的考虑,我们建议为 `[dev-dependencies]` 中的包指定相应的版本号
## 构建依赖
## [build-dependencies]
我们还可以指定某些依赖仅用于构建脚本:
```toml
[build-dependencies]

Loading…
Cancel
Save