WSL や仮想環境、VPS上で作業をする場合、cargo doc --open が使用できないので何かしらの手段で target/doc 内のコンテンツを配信する Web サーバを起動する必要があります。この手の簡易 HTTP サーバは探せばいくらでも出てくるのですが、cargo doc と組み合わせてコマンド一発で実行したかったので、cargo サブコマンド作成の練習がてらドキュメント生成とサーバが一つにまとまったコマンドを作ってみました。

https://github.com/ubnt-intrepid/cargo-docserve

現段階では次の機能を実装しています。

  • ドキュメント生成後、target/doc 内のコンテンツを配信する HTTP サーバを起動する
  • --watch オプションをつけると)src/ 内のファイル変更を監視しドキュメントの再生成とサーバの再起動を自動で行う

※ 正直言うと cargo-watch を使えばいい話なのですが、たまにサーバのプロセスが終了せず残ったりすることがあったので現在使用していません…

使い方

GitHub にソースコードを置いているので、--git オプションを用いて直接バイナリをインストールします。 cargo クレートに依存しているため cmakeopenssl などがないとインストールに失敗する可能性があります。

$ cargo install --git https://github.com/ubnt-intrepid/cargo-docserve.git

cargo docserve と実行すると、ドキュメントを生成したあとHTTPサーバが起動します。ルートディレクトリに target/doc をルートにマウントした状態でサーバが起動します。

$ cargo docserve --host 127.0.0.1 --port 8000
...
    Docserve Generating the documentation
 Documenting cargo-docserve v0.0.1 (file:///home/ubnt-intrepid/work/ubnt-intrepid/cargo-docserve)
    Finished dev [unoptimized + debuginfo] target(s) in 1.86s
    Docserve Starting HTTP server listening on http://127.0.0.1:8000

--watch オプションをつけることで、src/ 以下のファイルが更新されたときにドキュメント生成とサーバの再起動を行うようにできます。イベント通知用のクレートは notify を使用しました。

$ cargo docserve --watch

反省点、今後の改善案など

  • cargo に依存してしまっているのでビルドが面倒
  • イベント検知後の処理が「HTTPサーバのシャットダウン → ドキュメントの再生成 → サーバの再起動」と雑

See also

Appendix: nightly でのドキュメント生成について

nightly 版の rustdoc を使用する場合、mio など一部のクレートで(クレート内で rustdoc の出す警告を lint error と解釈してしまい)ドキュメント生成が失敗することがあります1。 おそらくこれは cargo のバージョンが 0.30.0 に更新されれば解決されますが、それまでは次のように rustdoc に渡すコマンドラインオプションを環境変数を介して設定することでドキュメントを生成することができます。

$ export RUSTDOCFLAGS="--cap-lints allow -Z unstable-features"
$ cargo docserve