• Stars
    star
    891
  • Rank 49,181 (Top 1.0 %)
  • Language
    Rust
  • License
    MIT License
  • Created over 8 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

crates.io documentation generator

Docs.rs

Build Status License

Docs.rs (formerly cratesfyi) is an open source project to host documentation of crates for the Rust Programming Language.

Docs.rs automatically builds crates' documentation released on crates.io using the nightly release of the Rust compiler.

This readme is for developing docs.rs. See the about page for user-facing documentation.

Changing the build environment

To make a change to the build environment and test that it works on docs.rs, see the wiki.

Development

The recommended way to develop docs.rs is a combination of cargo run for the main binary and docker-compose for the external services. This gives you reasonable incremental build times without having to add new users and packages to your host machine.

Git Hooks

For ease of use, git_hooks directory contains useful git hooks to make your development easier.

# Unix
cd .git/hooks && ln -s ../../.git_hooks/* . && cd ../..
# Powershell
cd .git/hooks && New-Item -Path ../../.git_hooks/* -ItemType SymbolicLink -Value . && cd ../..

Dependencies

Docs.rs requires at least the following native C dependencies.

  • gcc
  • g++
  • pkg-config
  • git
  • make
  • cmake
  • zlib
  • openssl (with dev pkgs) -- Ubuntu example sudo apt install libssl-dev

There may be other dependencies that have not been documented.

Getting started

Make sure you have docker-compose and are able to download ~10GB data on the first run. Also ensure that docker is installed and the service is running.

git clone https://github.com/rust-lang/docs.rs.git docs.rs
cd docs.rs
git submodule update --init
# Configure the default settings for external services
cp .env.sample .env
# Create the DOCSRS_PREFIX directory
mkdir -p ignored/cratesfyi-prefix/crates.io-index
# Builds the docs.rs binary
cargo build
# Start the external services.
# It may be `docker compose` in newer versions
docker-compose up -d db s3
# anything that doesn't run via docker-compose needs the settings defined in
# .env. Either via `. ./.env` as below, or via any dotenv shell integration.
. ./.env
# allow downloads from the s3 container to support the /crate/.../download endpoint
mcli policy set download docsrs/rust-docs-rs
# Setup the database you just created
cargo run -- database migrate
# Build a sample crate to make sure it works
# This also sets up the docs.rs build environment.
# This will take a while the first time but will be cached afterwards.
cargo run -- build crate regex 1.3.1
# Generate important files for the web navigation
cargo run -- build add-essential-files
# This starts the web server but does not build any crates.
# It does not automatically run the migrations, so you need to do that manually (see above).
cargo run -- start-web-server
# If you want the server to automatically restart when code or templates change
# you can use `cargo-watch`:
cargo watch -x "run -- start-web-server"

If you need to store big files in the repository's directory it's recommended to put them in the ignored/ subdirectory, which is ignored both by git and Docker.

Running the database and S3 server outside of docker-compose is possible, but not recommended or supported. Note that you will need docker installed no matter what, since it's used for Rustwide sandboxing.

Running tests

cargo test

Pure docker-compose

If you have trouble with the above commands, consider using docker-compose up --build, which uses docker-compose for the web server as well. This will not cache dependencies - in particular, you'll have to rebuild all 400 whenever the lockfile changes - but makes sure that you're in a known environment so you should have fewer problems getting started.

You can also use the web container to run builds on systems which don't support running builds directly (mostly on Mac OS or Windows):

# run a build for a single crate
docker-compose run web build crate regex 1.3.1
# or build essential files
docker-compose run web build add-essential-files
# rebuild the web container when you changed code.
docker-compose build web

Note that running tests is not supported when using pure docker-compose.

Please file bugs for any trouble you have running docs.rs!

Docker-Compose

The services started by Docker-Compose are defined in docker-compose.yml. Three services are defined:

name access credentials description
web http://localhost:3000 N/A A container running the docs.rs binary
db postgresql://cratesfyi:password@localhost:15432 - Postgres database used by web
s3 http://localhost:9000 cratesfyi - secret_key MinIO (simulates AWS S3) used by web

Rebuilding Containers

To rebuild the site, run docker-compose build. Note that docker-compose caches the build even if you change the source code, so this will be necessary anytime you make changes.

If you want to completely clean up the database, don't forget to remove the volumes too:

$ docker-compose down --volumes

FAQ

I see the error standard_init_linux.go:211: exec user process caused "no such file or directory" when I use docker-compose.

You probably have CRLF line endings. This causes the hashbang in the docker-entrypoint to be /bin/sh\r instead of /bin/sh. This is probably because you have git.autocrlf set to true, set it to input instead.

I see the error /opt/rustwide/cargo-home/bin/cargo: cannot execute binary file: Exec format error when running builds.

You are most likely not on a Linux platform. Running builds directly is only supported on x86_64-unknown-linux-gnu. On other platforms you can use the docker-compose run web build [...] workaround described above.

See rustwide#41 for more details about supporting more platforms directly.

All tests are failing or timing out

Our test setup needs a certain about of file descriptors.

At least 4096 should be enough, you can set it via:

$ ulimit -n 4096

CLI

See cargo run -- --help for a full list of commands.

Starting the web server

# This command will start web interface of docs.rs on http://localhost:3000
cargo run -- start-web-server

build subcommand

# Builds <CRATE_NAME> <CRATE_VERSION> and adds it into database
# This is the main command to build and add a documentation into docs.rs.
# For example, `docker-compose run web build crate regex 1.1.6`
cargo run -- build crate <CRATE_NAME> <CRATE_VERSION>

# alternatively, via the web container
docker-compose run web build crate <CRATE_NAME> <CRATE_VERSION>

# Builds every crate on crates.io and adds them into database
# (beware: this may take months to finish)
cargo run -- build world

# Builds a local package you have at <SOURCE> and adds it to the database.
# The package does not have to be on crates.io.
# The package must be on the local filesystem, git urls are not allowed.
cargo run -- build crate --local /path/to/source

database subcommand

# Adds a directory into database to serve with `staticfile` crate.
cargo run -- database add-directory <DIRECTORY> [PREFIX]

# Updates repository stats for crates.
# You need to set the DOCSRS_GITHUB_ACCESSTOKEN
# environment variable in order to run this command.
# Set DOCSRS_GITLAB_ACCESSTOKEN to raise the rate limit for GitLab repositories,
# or leave it blank to fetch repositories at a slower rate.
cargo run -- database update-repository-fields

If you want to explore or edit database manually, you can connect to the database with the psql command.

. ./.env
psql $DOCSRS_DATABASE_URL

The database contains a blacklist of crates that should not be built.

# List the crates on the blacklist
cargo run -- database blacklist list

# Adds <CRATE_NAME> to the blacklist
cargo run -- database blacklist add <CRATE_NAME>

# Removes <CRATE_NAME> from the blacklist
cargo run -- database blacklist remove <CRATE_NAME>

If you want to revert to a precise migration, you can run:

cargo run -- database migrate <migration number>

daemon subcommand

# Run a persistent daemon which queues builds and starts a web server.
cargo run -- daemon --registry-watcher=disabled
# Add crates to the queue
cargo run -- queue add <CRATE> <VERSION>

Updating vendored sources

The instructions & links for updating Font Awesome can be found on their website. Similarly, Pure-CSS also explains on theirs.

When updating Font Awesome, make sure to change $fa-font-path in scss/_variables.scss (it should be at the top of the file) to ../-/static. This will point font awesome at the correct path from which to request font and icon resources.

Contact

Docs.rs is run and maintained by the docs.rs team. You can find us in #t-docs-rs on zulip

More Repositories

1

rust

Empowering everyone to build reliable and efficient software.
Rust
85,122
star
2

rustlings

πŸ¦€ Small exercises to get you used to reading and writing Rust code!
Rust
47,148
star
3

mdBook

Create book from markdown files. Like Gitbook but implemented in Rust
Rust
15,892
star
4

book

The Rust Programming Language
Rust
13,981
star
5

rust-analyzer

A Rust compiler front-end for IDEs
Rust
13,175
star
6

cargo

The Rust package manager
Rust
11,293
star
7

rust-clippy

A bunch of lints to catch common mistakes and improve your Rust code. Book: https://doc.rust-lang.org/clippy/
Rust
9,860
star
8

rust-by-example

Learn Rust with examples (Live code editor included)
6,109
star
9

rustup

The Rust toolchain installer
Rust
5,558
star
10

rustfmt

Format Rust code
Rust
5,524
star
11

rfcs

RFCs for changes to Rust
Markdown
5,390
star
12

futures-rs

Zero-cost asynchronous programming in Rust
Rust
5,119
star
13

rust-bindgen

Automatically generates Rust FFI bindings to C (and some C++) libraries.
Rust
3,830
star
14

rust.vim

Vim configuration for Rust.
Vim Script
3,628
star
15

miri

An interpreter for Rust's mid-level intermediate representation
Rust
3,581
star
16

rls

Repository for the Rust Language Server (aka RLS)
Rust
3,530
star
17

regex

An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs.
Rust
3,083
star
18

crates.io

The Rust package registry
Rust
2,554
star
19

hashbrown

Rust port of Google's SwissTable hash map
Rust
2,194
star
20

log

Logging implementation for Rust
Rust
2,046
star
21

this-week-in-rust

Data for this-week-in-rust.org
HTML
1,826
star
22

libc

Raw bindings to platform APIs for Rust
Rust
1,786
star
23

chalk

An implementation and definition of the Rust trait system using a PROLOG-like logic solver
Rust
1,713
star
24

async-book

Asynchronous Programming in Rust
Shell
1,640
star
25

nomicon

The Dark Arts of Advanced and Unsafe Rust Programming
CSS
1,608
star
26

rustc-dev-guide

A guide to how rustc works and how to contribute to it.
HTML
1,522
star
27

git2-rs

libgit2 bindings for Rust
Rust
1,520
star
28

cc-rs

Rust library for build scripts to compile C/C++ code into a Rust library
Rust
1,491
star
29

vscode-rust

Rust extension for Visual Studio Code
TypeScript
1,388
star
30

rustc_codegen_cranelift

Cranelift based backend for rustc
Rust
1,348
star
31

polonius

Defines the Rust borrow checker.
Rust
1,207
star
32

api-guidelines

Rust API guidelines
1,186
star
33

reference

The Rust Reference
Rust
1,090
star
34

rust-playground

The Rust Playground
Rust
1,076
star
35

rust-mode

Emacs configuration for Rust
Emacs Lisp
1,009
star
36

rustfix

Automatically apply the suggestions made by rustc
Rust
857
star
37

rustc_codegen_gcc

libgccjit AOT codegen for rustc
Rust
850
star
38

portable-simd

The testing ground for the future of portable SIMD in Rust
Rust
775
star
39

datafrog

A lightweight Datalog engine in Rust
Rust
770
star
40

flate2-rs

DEFLATE, gzip, and zlib bindings for Rust
Rust
730
star
41

rust-semverver

Automatic checking for semantic versioning in library crates
Rust
637
star
42

socket2

Advanced configuration options for sockets.
Rust
633
star
43

unsafe-code-guidelines

Forum for discussion about what unsafe code can and can't do
618
star
44

crater

Run experiments across parts of the Rust ecosystem!
Rust
588
star
45

stdarch

Rust's standard library vendor-specific APIs and run-time feature detection
Rust
585
star
46

packed_simd

Portable Packed SIMD Vectors for Rust standard library
Rust
561
star
47

rustc-perf

Website for graphing performance of rustc
Rust
539
star
48

libm

A port of MUSL's libm to Rust.
Rust
481
star
49

cfg-if

A if/elif-like macro for Rust #[cfg] statements
Rust
479
star
50

crates.io-index

Registry index for crates.io
476
star
51

backtrace-rs

Backtraces in Rust
Rust
473
star
52

style-team

Home of the Rust style team
Rust
438
star
53

docker-rust

The official Docker images for Rust
Dockerfile
399
star
54

glob

Support for matching file paths against Unix shell style patterns.
Rust
381
star
55

rust-forge

Information useful to people contributing to Rust
Rust
380
star
56

compiler-team

A home for compiler team planning documents, meeting minutes, and other such things.
HTML
369
star
57

wg-async

Working group dedicated to improving the foundations of Async I/O in Rust
Rust
357
star
58

www.rust-lang.org

The home of the Rust website
Fluent
352
star
59

compiler-builtins

Porting `compiler-rt` intrinsics to Rust
Rust
328
star
60

measureme

Support crate for rustc's self-profiling feature
Rust
316
star
61

blog.rust-lang.org

The Rust Programming Language Blog
HTML
302
star
62

glacier

A big 'ol pile of ICE.
Rust
289
star
63

team

Rust teams structure
Rust
288
star
64

rustc-hash

Custom hash algorithm used by rustc (plus hashmap/set aliases): fast, deterministic, not secure
Rust
276
star
65

project-error-handling

Error handling project group
263
star
66

atom-ide-rust

Rust IDE support for Atom, powered by the Rust Analyzer or Rust Language Server
JavaScript
260
star
67

stacker

Manual segmented stacks for Rust
Rust
252
star
68

cmake-rs

Rust build dependency for running cmake
Rust
241
star
69

edition-guide

A guide to changes between various editions of Rust
233
star
70

getopts

The getopts repo maintained by the rust-lang project
Rust
229
star
71

a-mir-formality

a model of MIR and the Rust type/trait system
Rust
228
star
72

rust-roadmap-2017

Tracking Rust's roadmap
218
star
73

areweasyncyet.rs

Are we async yet?
Rust
209
star
74

rust-playpen

A web interface for running Rust code
Rust
208
star
75

annotate-snippets-rs

Library for snippet annotations
Rust
200
star
76

rustc-demangle

Rust symbol demangling
Rust
196
star
77

wg-allocators

Home of the Allocators working group: Paving a path for a standard set of allocator traits to be used in collections!
188
star
78

highfive

Github hooks to provide an encouraging atmosphere for new contributors
Python
184
star
79

lang-team

Home of the Rust lang team
JavaScript
184
star
80

rust-guidelines

This repository has moved
179
star
81

rustwide

Execute your code on the Rust ecosystem.
Rust
174
star
82

ferris-says

A Rust flavored implementation of `cowsay`
Rust
172
star
83

cargo-bisect-rustc

Bisects rustc, either nightlies or CI artifacts
Rust
171
star
84

homu

A bot that integrates with GitHub and your favorite continuous integration service
Python
164
star
85

rfcbot-rs

Coordinates asynchronous decision making on Rust repositories. Status of tracked issues and PRs can be viewed at https://rfcbot.rs.
Rust
157
star
86

triagebot

Automation/tooling for Rust spaces
Rust
155
star
87

prev.rust-lang.org

The previous Rust website. The current website's code is at https://github.com/rust-lang/www.rust-lang.org.
HTML
153
star
88

pkg-config-rs

Build library for invoking pkg-config for Rust
Rust
147
star
89

thanks

Celebrate Rust contributors.
Rust
143
star
90

rustc-reading-club

Rust Code Reading Clubs
141
star
91

gll

GLL parsing framework.
Rust
136
star
92

ena

An implementation of union-find / congruence-closure in Rust. Extracted from rustc for independent experimentation.
Rust
131
star
93

simpleinfra

Rust Infrastructure automation
HCL
128
star
94

wg-cargo-std-aware

Repo for working on "std aware cargo"
125
star
95

rust-memory-model

Collecting examples and information to help design a memory model for Rust.
Python
125
star
96

rust-artwork

Official artwork for the Rust project.
120
star
97

rustup-components-history

Rustup package status history
Rust
100
star
98

libs-team

The home of the library team
Rust
100
star
99

const-eval

home for proposals in and around compile-time function evaluation
CSS
98
star
100

wg-grammar

Where the work of WG-grammar, aiming to provide a canonical grammar for Rust, resides
Rust
98
star