rustdoc is a great tool, but as of now there isnât an official way to have its generated docs refresh as you make edits. Running cargo doc with the --open argument will open the generated docs in browser window. If you make changes to your source code, you’ll need to re-run cargo doc to have the changes reflected in your browser. By chaining together a few other Rust tools, we can pretty easily get the functionality of live-reloading docs.
We’ll be 2 tools:
- cargo-watch to watch when our projectâs source has changed and trigger the docs rebuild.
- http as a static server for the generated docs.
- This isnât strictly necessary: As mentioned earlier, you can use the
--openargument withcargo docto view docs using thefile://protocol, but I like having alocalhostaddress to visit.
- This isnât strictly necessary: As mentioned earlier, you can use the
Iâll assume that you already have cargo installed. If you donât, then you can use rustup to install it.
Step 1: Install cargo-watch and https
First, install both commands weâll need:
cargo install cargo-watch https
Step 2: Run Watch Command
Now, navigate to the project directory that contains your Cargo.toml file. Then, run the following:
cargo watch -s 'cargo doc && http target/doc'
You should now see something like the following:
[Running cargo doc && http target/doc]
Documenting docs-example v0.1.0 (file:///path/to/project/docs-example)
Finished dev [unoptimized + debuginfo] target(s) in 0.43s
Hosting "target/doc" on port 8000 without TLSâŚ
Ctrl-C to stop.
You can visit localhost:8000 in your browser to view the generated docs. (Note: youâll initially see a directory page, so youâll have to navigate to one of the package listings to see actual docs)
If you make any changes to any source file in your project, youâll see that cargo-watch will automatically re-run cargo doc and restart the file server. You should be able to refresh your browser and see the documentation changes live.
Bonus: Auto-refresh
One annoyance with this approach is that editing a source file does not trigger a refresh in the browser (i.e. you still have to refresh the page manually).
If youâre fine with using a node-based tool, browser-sync fixes this problem.
Install with:
npm install -g browser-sync
⌠then edit your cargo-watch command to use browser-sync instead of http:
cargo watch -s 'cargo doc && browser-sync start --ss target/doc -s target/doc --directory --no-open'
Now, visit localhost:3000 (or whichever port is listed on startup). Any subsequent changes to your Rust source code will now trigger any open browsers to refresh automatically with the updated documentation.
I’ve found that using this tweak to have auto-refreshing docs makes it much more pleasant to document my Rust crates. I’d love to see if there’s a more streamlined way to have auto-refreshing docs – be sure to let me know! đ
More Information
- To learn the basics of
rustdoc(which powerscargo doc), check this chapter in the rust book.
- These issues give context as to why this functionality isnât officially supported (as of now): cargo#1472, cargo#4966