必要项

稳定版 crate 必须具有稳定的公有依赖

Public dependencies of a stable crate are stable (C-STABLE)

一个稳定版 (stable) 的 crate (版本号>=1.0.0) ,其所有的公有依赖都必须是稳定的。

公有依赖 (public dependencies) 指当前 crate 使用的公有 API 所来自的 crate 。

pub fn do_my_thing(arg: other_crate::TheirThing) { /* ... */ }

对于一个 crate 定义这样的函数,如果 other_crate 不是稳定的话, 那么这个 crate 就不是稳定的。

要小心,公有依赖可能在不经意之间出现在意料之外的地方。

pub struct Error {
    private: ErrorImpl,
}

enum ErrorImpl {
    Io(io::Error),
    // 这没问题,即使 `other_crate` 不是稳定的,因为 `ErrorImpl` 是私有的
    Dep(other_crate::Error),
}

// 不!这让可能不稳定的 `other_crate` 暴露在当前 crate 的公共 API 里
impl From<other_crate::Error> for Error {
    fn from(err: other_crate::Error) -> Self {
        Error { private: ErrorImpl::Dep(err) }
    }
}

crate 及其依赖必须有许可证

Crate and its dependencies have a permissive license (C-PERMISSIVE)

Rust 项目组编写的软件都是 MITApache 2.0 双重许可的。 如果 crates 需要最大程度地与 Rust 生态兼容,那么建议也这么做。 下面谈谈选择其他的许可。

这里不会详细解释 Rust 版权, Rust FAQ 谈到了一小部分。 这些原则涉及到 Rust 能否被通用的问题, 在选择许可方面说得不多。

Cargo.toml 文件的 license 字段填上你的项目适用的许可证。

[package]
name = "..."
version = "..."
authors = ["..."]
license = "MIT OR Apache-2.0"

在仓库的根目录添加 LICENSE-APACHELICENSE-MIT 文件, 文件里面涵盖许可的正文。 你可以在 choosealicense.com 获得这些许可, 比如 Apache-2.0MIT

然后在 README.md 文件的最后写上:

## License

Licensed under either of

 * Apache License, Version 2.0
   ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
 * MIT license
   ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)

at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.

除了 MIT/Apache-2.0 双重许可之外, 另一种 Rust crate 作者们常用的许可声明方式是使用单独的 MIT 或者 BSD 许可。 BSD 许可方式完全与 Rust 的 MIT 许可方式兼容, 因为它对 MIT 许可做了最小程度的限制。

不建议 想要完全兼容 Rust 许可的 crates 仅仅使用 Apache 许可证。 虽然 Apache 许可证比 MIT 和 BSD 更严格, 但是在某些场景下会打击或者打消使用这些 cates 的念头, 所以只使用 Apache 许可证 的软件 在大多数 Rust 技术栈能使用的地方 无法被使用。

一个 crate 依赖的许可证可能影响和限制 crate 自身的分发, 所以 自由许可 的 crate 通常应仅依赖 自由许可 的 crates 。