#目的
Rustでクレート(俗に言うライブラリ)の開発をどうやって行えばよいかわからなかったので、やり方を残します。公式文書にはやり方がきっちり書かれていますが、網羅的すぎて情報を探し当てられない場合もあるので、この記事でどこを見るべきかというヒントにでもなればと思います。
#前提
- Rustが正しくインストールされている前提です。
- Cargoでビルド・実行することを前提としています。
- ローカルに保存したクレートを呼び出すことを前提としてます。
- Macで実行する前提です。Linuxでは同じだと思いますがWindowsでは違う可能性があります。
#参照すべき文書
Rust Tutorial 2.はじめる
→後半部分にCargoの基本的な使い方が記載されています。
Cargo Book(3.1 Specify Dependencies)
→Cargoで読み込むクレートの記述方法が記載されています。gitリポジトリを参照する方法とローカル環境でのパス指定の方法がありますが今回はローカル環境を指定します。
#今回使ったクレート
imageproc
というgitリポジトリにあるクレートをローカルに保存して、ビルド時にローカルクレートを呼び出します。ついでにサンプルプログラムも動かします。
#Step1:imageproc をローカルにコピー&ビルド
任意のディレクトリで以下を実行
git clone https://github.com/image-rs/imageproc
./imageproc というフォルダができて、gitリポジトリの中身がすべてコピーされています。
./imageproc 内でビルド実行
cargo build
注)ビルドしないと後で読み込みに失敗します
#Step2:Cargo で新規プロジェクト作成
./imageprocを生成したのと同じディレクトリで以下を実行。
cargo new test_imageproc --bin
./test_imageproc というフォルダが自動で生成されてビルドに必要なファイルも自動生成されます。
#Step3:サンプルコードをコピー
以下のコマンドで imageproc 内のサンプルプログラムを test_imageproc にコピーする。main.rs は Hello World が書かれたデフォルトプログラムなので上書きしてOK。
cp ./imageproc/examples/blend.rs ./test_imageproc/src/main.rs
#Step4:Cargo.tomlを修正
./test_imageproc/Cargo.tomlを以下のように修正する。
[package]
name = "test_imageproc"
version = "0.1.0"
authors = ["someuser"]
edition = "2019"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
image="0.22.3"
imageproc="0.19.2"
[patch.crates-io]
imageproc={path = "../imageproc"}
- Step3でコピーしたサンプルプログラムは image、imageproc という二つのクレートを呼び出していますが、今回はimageは正式版をimageprocはローカル版を呼び出します。
- imageproc="0.19.2"が正式リリースされているクレートで、それに対しパッチを作るという考えのもとに[patch.crates-io]でローカルのクレートを上書きするような形で読み込みます。相対パスで記載していますが、絶対パスでもよい。
#Step5:ビルドの実行
./test_imageproc 内で以下を実行
cargo build
注)エラーになる場合はStep1で imageproc をビルドしていない可能性あり
実行すると [dependencies] に従って必要なクレートが全て読み込まれます。最後の方で以下が出力されれば成功。imageproc がローカルから読み込まれている。
> cargo build
...
Compiling image v0.22.3
Compiling imageproc v0.19.2 (/Users/someuser/src/imageproc)
Compiling test_imageproc v0.1.0 (/Users/someuser/src/test_imageproc)
Finished dev [unoptimized + debuginfo] target(s) in 52.78s
#Step6:サンプルプログラムのバイナリ実行
ビルドされたバイナリを実行
./test_imageproc/target/debug/test_imageproc
gamma_blend.png
naive_blend.png
という二つのファイルが生成されていると思います。
#最後に
この状態でローカルの imageproc を適宜修正すれば自分のクレートが開発できる、ということになります。imageproc を修正してビルド、そして呼び出し側をビルドして実行、で反映されます。修正内容に自信があれば正式版に反映するのもよいでしょう(プルリクエストとかやるのかな)。そのへんの手順は別のサイトを参照してください。