- 特に最新動向を追ったりはしていないので、情報が古い可能性はある
- https://www.rustup.rs/ に記載の方法で必要なツールの一式が入る
- バージョンは最新の安定版を使用
- https://doc.rust-lang.org/book/
- 公式のRustの解説ドキュメント
- とりあえずこれを読んでおけば大丈夫感がある
- 物足りないなら http://rustbyexample.com/ も読んでも良い
- https://doc.rust-lang.org/nomicon/
- unsafeなRustを書くなら必読
- そして、効率的なデータ構造を実装したかったり、低レイヤー寄りの実装をしたいならunsafeなRustはほぼ必須
- https://aturon.github.io/README.html
- スタイルガイドライン
- 名前付けとか良いお作法とかいろいろと参考になる
- 関連(未読): https://github.com/brson/rust-api-guidelines
- https://danielkeep.github.io/tlborm/book/README.html
- マクロ周りの解説
- http://doc.crates.io/guide.html
- Cargoのドキュメント
- Cargoは結構多機能なので、ドキュメントには一通り目を通しておくと便利
# フォーマッタ
$ cargo install rustfmt
# コード補完とか諸々
$ cargo install racer
# 高速grep
$ cargo install ripgrep
# Rustコード片のお手軽実行用
# (https://github.com/DanielKeep/cargo-script の方がメジャー)
$ cargo install evalrs
# `cargo install-update -a`で、インストール済みライブラリ群を一括更新してくれる
$ cargo install cargo-update
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(package-refresh-contents)
;; Rustモード
(package-install 'rust-mode)
;; Cargoモード
;;
;; 以下を良く使う:
;; - テスト実行:
;; - Ctrl-K + Ctrl-C + Ctrl-T
;; - チェックビルド:
;; - Ctrl-C + Ctrl-C + Ctrl-K
;; - バイナリを生成しないので高速
;; - ドキュメントオープン:
;; - Ctrl-C + Ctrl-C + Ctrl-V
;; - ドキュメント生成:
;; - Ctrl-C + Ctrl-C + Ctrl-D
;; - 前回実行コマンドの再実行:
;; - Ctrl-C + Ctrl-C + Ctrl-C
(package-install 'cargo)
;; コード補完とか定義元に飛んだりとか
(package-install 'racer)
(package-install 'company-racer)
;; ソース: https://github.com/sile/dotfiles/blob/master/.emacs
(add-hook 'rust-mode-hook #'cargo-minor-mode)
(add-hook 'rust-mode-hook #'racer-mode)
;; ファイル保存時に常にrustfmtを適用
(add-hook 'rust-mode-hook #'rust-enable-format-on-save)
(add-hook 'racer-mode-hook #'eldoc-mode)
(add-hook 'racer-mode-hook #'company-mode)
(setq company-tooltip-align-annotations t)
(setq racer-rust-src-path (concat (file-name-as-directory (getenv "HOME")) "dev/rust/rust/src/"))
(setq compilation-ask-about-save nil)
- clap:
- https://github.com/kbknapp/clap-rs
- コマンドライン引数パーサ
- 凄く多機能、かつ、直観的に使えて便利
- exampleコマンド(
crate-root/examples/*.rs
)が凄く簡単に作れる - (自作の)ほぼ全てのライブラリの
dev-dependencies
に含まれている - 例: https://github.com/sile/erl_tokenize/blob/master/examples/tokenize.rs#L12
- slog:
- https://github.com/slog-rs/slog
- ロガー
- https://crates.io/crates/log の方が標準的っぽくはあるけど、slogの方が設計思想的に好み - サーバやライブラリではなく、通常のバイナリ(コマンド)で使うならslogの機能は過剰かも
- slogを手軽に扱えるようにするための軽いライブラリ: https://github.com/sile/sloggers
- trackable:
- 主にエラーハンドリング用のライブラリ
- Rustでのエラーハンドリング自体に関してはRustbookが詳しい
try!
や?
を、ほぼそのまま置き換えるイメージ- 一例として
track_try!
というマクロを提供している try!
等と異なるのは、エラー発生地点までのトレース情報が付与されること- また、異なる
Error
トレイト実装間の相互変換も容易になるようにしている
- 一例として
- https://github.com/brson/error-chain の方がメジャー
- 主にエラーハンドリング用のライブラリ
- serde:
- https://github.com/serde-rs/serde
- シリアライズライブラリ
serde_derive
と組み合わせることで#[derive(Serialize, Deserialize)]
と書くだけで、たいていのデータ構造がシリアライズ可能になるので便利- 設定ファイルの読み込み処理や、ネットワークを跨いだデータ転送時のデータ変換処理等を自前で書かなくても良くなる
- 少し複雑な設定をコマンドに指定したいなら、clapではなく、serde+tomlを使った方が楽
- serdeconvでTOML/JSON/MessagePackに関する変換を手軽に行える
- futures:
- いわゆる
Future
- 非同期I/O系のプログラミングをするなら事実上必須
futures
は「非同期I/O処理の記述」を行うのみなので、実際に実行するには別のライブラリが必要- 良く使うのはfibers
- tokioの方がメジャー
- いわゆる
- その他:
- byteorder, rand, num, etc
- https://crates.io/ にアカウントを登録して
cargo publish
でリリース(パッケージ登録)が可能Cargo.toml
ファイルの参考: https://github.com/sile/libflate/blob/master/Cargo.toml
- crates.ioにpublishすると自動で
https://docs.rs/
にも(バージョン毎の)ドキュメントを生成してくれる - ライブラリのリリース前には、crateレベルで
#![warn(missing_docs)]
を指定 - 公開コンポーネントに対するドキュメント記述漏れを防止 - バイナリのcrateを登録した場合には
cargo install CRATE_NAME
でインストールが可能になる
crateルート/examples/*.rs
のファイル群はcaro run --example FILENAME
で実行可能- travis: https://github.com/sile/libflate/blob/master/.travis.yml
- コードカバレッジ計測:
- kcovを使えば一応可能 - codecovとの連携: https://github.com/codecov/example-rust
- 開発サイクル:
- 基本は
cargo check
ないしcargo test
とコード修正の繰り返し - 少し変わった処理を走らせたり確認したい場合には
cargo run --examples FILENAME
でコマンド実行 - リリース前には
cargo doc
で生成されたドキュメントを確認しつつ諸々微調整を行う
- 基本は