-
Notifications
You must be signed in to change notification settings - Fork 2.6k
docs(contrib): Move overview to lib #11809
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,53 +9,92 @@ | |
|
||
//! # Cargo as a library | ||
//! | ||
//! Cargo, the Rust package manager, is also provided as a library. | ||
//! | ||
//! There are two places you can find API documentation of cargo-the-library, | ||
//! | ||
//! - <https://docs.rs/cargo> and | ||
//! - <https://doc.rust-lang.org/nightly/nightly-rustc/cargo>. | ||
//! | ||
//! Each of them targets on a slightly different audience. | ||
//! | ||
//! ## For external tool developers | ||
//! | ||
//! The documentation on <https://docs.rs/cargo> contains public-facing items in cargo-the-library. | ||
//! External tool developers may find it useful when trying to reuse existing building blocks from Cargo. | ||
//! However, using Cargo as a library has drawbacks, especially cargo-the-library is unstable, | ||
//! and there is no clear path to stabilize it soon at the time of writing. | ||
//! See [The Cargo Book: External tools] for more on this topic. | ||
//! | ||
//! Cargo API documentation on docs.rs gets updates along with each Rust release. | ||
//! Its version always has a 0 major version to state it is unstable. | ||
//! The minor version is always +1 of rustc's minor version | ||
//! (that is, `cargo 0.66.0` corresponds to `rustc 1.65`). | ||
//! | ||
//! ## For Cargo contributors | ||
//! - <https://docs.rs/cargo>: targeted at external tool developers using cargo-the-library | ||
//! - Released with every rustc release | ||
//! - <https://doc.rust-lang.org/nightly/nightly-rustc/cargo>: targeted at cargo contributors | ||
//! - Updated on each update of the `cargo` submodule in `rust-lang/rust` | ||
//! | ||
//! The documentation on <https://doc.rust-lang.org/nightly/nightly-rustc/cargo> contains all items in Cargo. | ||
//! Contributors of Cargo may find it useful as a reference of Cargo's implementation details. | ||
//! It's built with `--document-private-items` rustdoc flag, | ||
//! so you might expect to see some noise and strange items here. | ||
//! The Cargo team and contributors strive for jotting down every details | ||
//! from their brains in each issue and PR. | ||
//! However, something might just disappear in the air with no reason. | ||
//! This documentation can be seen as their extended minds, | ||
//! sharing designs and hacks behind both public and private interfaces. | ||
//! **WARNING:** Using Cargo as a library has drawbacks, particulary the API is unstable, | ||
//! and there is no clear path to stabilize it soon at the time of writing. See [The Cargo Book: | ||
//! External tools] for more on this topic. | ||
//! | ||
//! If you are just diving into Cargo internals, [Cargo Architecture Overview] | ||
//! is the best material to get a broader context of how Cargo works under the hood. | ||
//! Things also worth a read are important concepts reside in source code, | ||
//! which Cargo developers have been crafting for a while, namely | ||
//! ## Overview | ||
//! | ||
//! - [`cargo::core::resolver`](crate::core::resolver), | ||
//! - [`cargo::core::compiler::fingerprint`](core/compiler/fingerprint/index.html), | ||
//! - [`cargo::util::config`](crate::util::config), | ||
//! - [`cargo::ops::fix`](ops/fix/index.html), and | ||
//! - [`cargo::sources::registry`](crate::sources::registry). | ||
//! - [`ops`]: | ||
//! Every major operation is implemented here. Each command is a thin wrapper around ops. | ||
//! - [`ops::cargo_compile`]: | ||
//! This is the entry point for all the compilation commands. This is a | ||
//! good place to start if you want to follow how compilation starts and | ||
//! flows to completion. | ||
//! - [`core::resolver`]: | ||
//! This is the dependency and feature resolvers. | ||
//! - [`core::compiler`]: | ||
//! This is the code responsible for running `rustc` and `rustdoc`. | ||
//! - [`core::compiler::build_context`]: | ||
//! The [`BuildContext`]['core::compiler::BuildContext] is the result of the "front end" of the | ||
//! build process. This contains the graph of work to perform and any settings necessary for | ||
//! `rustc`. After this is built, the next stage of building is handled in | ||
//! [`Context`][core::compiler::Context]. | ||
//! - [`core::compiler::context`]: | ||
//! The `Context` is the mutable state used during the build process. This | ||
//! is the core of the build process, and everything is coordinated through | ||
//! this. | ||
//! - [`core::compiler::fingerprint`]: | ||
//! The `fingerprint` module contains all the code that handles detecting | ||
//! if a crate needs to be recompiled. | ||
//! - [`core::source`]: | ||
//! The [`core::Source`] trait is an abstraction over different sources of packages. | ||
//! Sources are uniquely identified by a [`core::SourceId`]. Sources are implemented in the [`sources`] | ||
//! directory. | ||
//! - [`util`]: | ||
//! This directory contains generally-useful utility modules. | ||
//! - [`util::config`]: | ||
//! This directory contains the config parser. It makes heavy use of | ||
//! [serde](https://serde.rs/) to merge and translate config values. The | ||
//! [`util::Config`] is usually accessed from the | ||
//! [`core::Workspace`] | ||
//! though references to it are scattered around for more convenient access. | ||
//! - [`util::toml`]: | ||
//! This directory contains the code for parsing `Cargo.toml` files. | ||
//! - [`ops::lockfile`]: | ||
//! This is where `Cargo.lock` files are loaded and saved. | ||
//! | ||
//! This API documentation is published on each push of rust-lang/cargo master branch. | ||
//! In other words, it always reflects the latest doc comments in source code on master branch. | ||
//! Related crates: | ||
//! - [`cargo-platform`](https://crates.io/crates/cargo-platform) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/cargo_platform)): | ||
//! This library handles parsing `cfg` expressions. | ||
//! - [`cargo-util`](https://crates.io/crates/cargo-util) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/cargo_util)): | ||
//! This contains general utility code that is shared between cargo and the testsuite | ||
//! - [`crates-io`](https://crates.io/crates/crates-io) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/crates_io)): | ||
//! This contains code for accessing the crates.io API. | ||
//! - [`home`](https://crates.io/crates/home): | ||
//! This library is shared between cargo and rustup and is used for finding their home directories. | ||
//! This is not directly depended upon with a `path` dependency; cargo uses the version from crates.io. | ||
//! It is intended to be versioned and published independently of Rust's release system. | ||
//! Whenever a change needs to be made, bump the version in Cargo.toml and `cargo publish` it manually, and then update cargo's `Cargo.toml` to depend on the new version. | ||
//! - [`cargo-test-support`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-test-support) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/cargo_test_support/index.html)): | ||
//! This contains a variety of code to support writing tests | ||
//! - [`cargo-test-macro`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-test-macro) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/cargo_test_macro/index.html)): | ||
//! This is the `#[cargo_test]` proc-macro used by the test suite to define tests. | ||
//! - [`credential`](https://github.com/rust-lang/cargo/tree/master/crates/credential) | ||
//! This subdirectory contains several packages for implementing the | ||
//! experimental | ||
//! [credential-process](https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#credential-process) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The layout looks fine here, though I prefer reference-style links. They are more readable at source code level. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I try them every once in a while but always feel like they are more of a pain to initially write (duplicating the referencing, jumping back and forth) and then dealing with later (more places to touch when updating). |
||
//! feature. | ||
//! - [`mdman`](https://github.com/rust-lang/cargo/tree/master/crates/mdman) | ||
//! ([nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/mdman/index.html)): | ||
//! This is a utility for generating cargo's man pages. See [Building the man | ||
//! pages](https://github.com/rust-lang/cargo/tree/master/src/doc#building-the-man-pages) | ||
//! for more information. | ||
//! - [`resolver-tests`](https://github.com/rust-lang/cargo/tree/master/crates/resolver-tests) | ||
//! This is a dedicated package that defines tests for the [dependency | ||
//! resolver][core::resolver]. | ||
//! | ||
//! ## Contribute to Cargo documentations | ||
//! | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,108 +1,3 @@ | ||
# Codebase Overview | ||
|
||
This is a very high-level overview of the Cargo codebase. | ||
|
||
* [`src/bin/cargo`](https://github.com/rust-lang/cargo/tree/master/src/bin/cargo) | ||
--- Cargo is split in a library and a binary. This is the binary side that | ||
handles argument parsing, and then calls into the library to perform the | ||
appropriate subcommand. Each Cargo subcommand is a separate module here. See | ||
[SubCommands](subcommands.md). | ||
|
||
* [`src/cargo/ops`](https://github.com/rust-lang/cargo/tree/master/src/cargo/ops) | ||
--- Every major operation is implemented here. This is where the binary CLI | ||
usually calls into to perform the appropriate action. | ||
|
||
* [`src/cargo/ops/cargo_compile/mod.rs`](https://github.com/rust-lang/cargo/blob/master/src/cargo/ops/cargo_compile/mod.rs) | ||
--- This is the entry point for all the compilation commands. This is a | ||
good place to start if you want to follow how compilation starts and | ||
flows to completion. | ||
|
||
* [`src/cargo/core/resolver`](https://github.com/rust-lang/cargo/tree/master/src/cargo/core/resolver) | ||
--- This is the dependency and feature resolvers. | ||
|
||
* [`src/cargo/core/compiler`](https://github.com/rust-lang/cargo/tree/master/src/cargo/core/compiler) | ||
--- This is the code responsible for running `rustc` and `rustdoc`. | ||
|
||
* [`src/cargo/core/compiler/build_context/mod.rs`](https://github.com/rust-lang/cargo/blob/master/src/cargo/core/compiler/build_context/mod.rs) | ||
--- The `BuildContext` is the result of the "front end" of the build | ||
process. This contains the graph of work to perform and any settings | ||
necessary for `rustc`. After this is built, the next stage of building | ||
is handled in `Context`. | ||
|
||
* [`src/cargo/core/compiler/context`](https://github.com/rust-lang/cargo/blob/master/src/cargo/core/compiler/context/mod.rs) | ||
--- The `Context` is the mutable state used during the build process. This | ||
is the core of the build process, and everything is coordinated through | ||
this. | ||
|
||
* [`src/cargo/core/compiler/fingerprint.rs`](https://github.com/rust-lang/cargo/blob/master/src/cargo/core/compiler/fingerprint.rs) | ||
--- The `fingerprint` module contains all the code that handles detecting | ||
if a crate needs to be recompiled. | ||
|
||
* [`src/cargo/core/source`](https://github.com/rust-lang/cargo/tree/master/src/cargo/core/source) | ||
--- The `Source` trait is an abstraction over different sources of packages. | ||
Sources are uniquely identified by a `SourceId`. Sources are implemented in | ||
the | ||
[`src/cargo/sources`](https://github.com/rust-lang/cargo/tree/master/src/cargo/sources) | ||
directory. | ||
|
||
* [`src/cargo/util`](https://github.com/rust-lang/cargo/tree/master/src/cargo/util) | ||
--- This directory contains generally-useful utility modules. | ||
|
||
* [`src/cargo/util/config`](https://github.com/rust-lang/cargo/tree/master/src/cargo/util/config) | ||
--- This directory contains the config parser. It makes heavy use of | ||
[serde](https://serde.rs/) to merge and translate config values. The | ||
`Config` is usually accessed from the | ||
[`Workspace`](https://github.com/rust-lang/cargo/blob/master/src/cargo/core/workspace.rs), | ||
though references to it are scattered around for more convenient access. | ||
|
||
* [`src/cargo/util/toml`](https://github.com/rust-lang/cargo/tree/master/src/cargo/util/toml) | ||
--- This directory contains the code for parsing `Cargo.toml` files. | ||
|
||
* [`src/cargo/ops/lockfile.rs`](https://github.com/rust-lang/cargo/blob/master/src/cargo/ops/lockfile.rs) | ||
--- This is where `Cargo.lock` files are loaded and saved. | ||
|
||
* [`src/doc`](https://github.com/rust-lang/cargo/tree/master/src/doc) | ||
--- This directory contains Cargo's documentation and man pages. | ||
|
||
* [`src/etc`](https://github.com/rust-lang/cargo/tree/master/src/etc) | ||
--- These are files that get distributed in the `etc` directory in the Rust release. | ||
The man pages are auto-generated by a script in the `src/doc` directory. | ||
|
||
* [`crates`](https://github.com/rust-lang/cargo/tree/master/crates) | ||
--- A collection of independent crates used by Cargo. | ||
|
||
## Extra crates | ||
|
||
Some functionality is split off into separate crates, usually in the | ||
[`crates`](https://github.com/rust-lang/cargo/tree/master/crates) directory. | ||
|
||
* [`cargo-platform`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-platform) | ||
--- This library handles parsing `cfg` expressions. | ||
* [`cargo-test-macro`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-test-macro) | ||
--- This is a proc-macro used by the test suite to define tests. More | ||
information can be found at [`cargo_test` | ||
attribute](../tests/writing.md#cargo_test-attribute). | ||
* [`cargo-test-support`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-test-support) | ||
--- This contains a variety of code to support [writing | ||
tests](../tests/writing.md). | ||
* [`cargo-util`](https://github.com/rust-lang/cargo/tree/master/crates/cargo-util) | ||
--- This contains general utility code that is shared between cargo and the | ||
testsuite. | ||
* [`crates-io`](https://github.com/rust-lang/cargo/tree/master/crates/crates-io) | ||
--- This contains code for accessing the crates.io API. | ||
* [`credential`](https://github.com/rust-lang/cargo/tree/master/crates/credential) | ||
--- This subdirectory contains several packages for implementing the | ||
experimental | ||
[credential-process](https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#credential-process) | ||
feature. | ||
* [`home`](https://github.com/rust-lang/cargo/tree/master/crates/home) --- This library is shared between cargo and rustup and is used for finding their home directories. | ||
This is not directly depended upon with a `path` dependency; cargo uses the version from crates.io. | ||
It is intended to be versioned and published independently of Rust's release system. | ||
Whenever a change needs to be made, bump the version in Cargo.toml and `cargo publish` it manually, and then update cargo's `Cargo.toml` to depend on the new version. | ||
* [`mdman`](https://github.com/rust-lang/cargo/tree/master/crates/mdman) | ||
--- This is a utility for generating cargo's man pages. See [Building the man | ||
pages](https://github.com/rust-lang/cargo/tree/master/src/doc#building-the-man-pages) | ||
for more information. | ||
* [`resolver-tests`](https://github.com/rust-lang/cargo/tree/master/crates/resolver-tests) | ||
--- This is a dedicated package that defines tests for the [dependency | ||
resolver](../architecture/packages.md#resolver). | ||
epage marked this conversation as resolved.
Show resolved
Hide resolved
|
||
See [nightly docs](https://doc.rust-lang.org/nightly/nightly-rustc/cargo/index.html) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not really a big deal. Just a bit worried making these modules public. Maintainer now need to gatekeep any misuse during the review.