changed 5 years ago
Linked with GitHub

Rust勉強会 第14回

14章

2020/10/23 岡本拓海


本日のメニュー

  1. リリースプロファイルでビルドをカスタマイズする
  2. crates.ioでライブラリを公開する
  3. ワークスペースで巨大なプロジェクトを体系化する
  4. crates.ioからバイナリをインストールする
  5. 独自のコマンドを使用してCargoを拡張する

プレゼン20分くらい+議論10分位で18:30前後終了を目指します。


リリースプロファイルでビルドをカスタマイズする

Rustのビルドプロファイル

  • devプロファイル
    • 通常cargo buildで生成される
    • 開発用途
  • release プロファイル
    • cargo build --releaseで生成
    • リリース用

ビルドのカスタマイズ

Cargo.tomlファイルで最適化設定をカスタマイズできます。

[profile.dev]
opt-level = 0 #最適化レベル0

[profile.release]
opt-level = 3 #最適化レベル3

crates.ioでライブラリを公開する(準備)

プロジェクトの依存としてcrates.ioのパッケージを使用しましたが、 自分のパッケージを公開することで他の人とコードを共有することもできます。 crates.ioのクレート登録所は、自分のパッケージのソースコードを配布するので、 主にオープンソースのコードをホストします。


ドキュメンテーションコメント

///でドキュメンテーションコメントです

(javadocとかdoxygenとかで見たことありますよね)

以下を記述してcargo doc --openでクレートのドキュメント用のHTMLを自動で生成してくれます

/// Adds one to the number given. /// /// # Examples /// /// ``` /// let five = 5; /// /// assert_eq!(6, my_crate::add_one(5)); /// ``` pub fn add_one(x: i32) -> i32 { x + 1 }

よく使われるセクション

  • Panics
    • ドキュメント対象の関数がpanic!する可能性についての記述
  • Errors
    • Resultを返す場合、起きうるエラーの種類条件についての記述
  • Safety
    • 関数がunsafeな理由の説明

便利!ドキュメンテーションテスト

'''cargo test'''を走らせた時ドキュメンテーションコメントにコードが含まれていると、そのコードも自動でテストしてくれます。

/// Adds one to the number given. /// /// # Examples /// /// ``` /// let five = 5; /// /// assert_eq!(6, my_crate::add_one(5)); /// ``` pub fn add_one(x: i32) -> i32 { x + 1 }

lib.rs等のファイルにコメントをつける

//!を使いましょう。

モジュールの内部で使用して、クレートやモジュール全体にドキュメントをつけます。


pub useで便利な公開APIをエクスポートする

これを

pub mod kinds {
   pub enum PrimaryColor {
     // ---snip---
   }
   pub enum SecondaryColor {
    // ---snip---
   }
}

pub mod utils {
    use kinds::*;
    pub fn mix(c1: PrimaryColor, c2: PrimaryColor) -> SecondaryColor {
        // --snip--
    }
}

pub useで便利な公開APIをエクスポートする

こうじゃ

pub use kinds::PrimaryColor;
pub use kinds::SecondaryColor;
pub use utils::mix;

pub mod kinds {
    // --snip--
}

pub mod utils {
    // --snip--
}

pub useで便利な公開APIをエクスポートする

するとこうなる

extern crate art;
//use art::kinds::PrimaryColor;
use art::PrimaryColor;

//use art::utils::mix;
use art::mix;

fn main() {
    // --snip--
}


crates.ioでライブラリを公開する

crates.ioに作ったライブラリを公開しましょう!!


Crates.ioのアカウントをセットアップする

  1. https://crates.io/ に行ってアカウントを作る
    • Githubアカウントで作れる
  2. https://crates.io/me/ でアカウント設定に行き、APIキーを取得
  3. 以下のコマンドでcrates.ioにログインする
    ​​​​cargo login some_like_your_api_key
    

クレートにメタデータを追加する

以下のように最低限のメタデータを追加します

[package]
name = "guessing_game"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
description = "A fun game where you guess what number the computer has chosen."
license = "MIT OR Apache-2.0"

Crates.ioに公開する

以下のコマンドでcrates.ioに自分のクレートを公開できます!!

cargo publish

https://crates.io/dashboard を見ると自分の公開したクレートが表示されているはずです。


既存のクレートの新バージョンを公開する

クレートに変更を行い、新バージョンをリリースする準備ができたら、 Cargo.tomlファイルに指定されたversionの値を変更し、再公開します。 セマンティックバージョンルールを使用して加えた変更の種類に基づいて次の適切なバージョン番号を決定してください。 そして、cargo publishを実行し、新バージョンをアップロードします。


cargo yankでCrates.ioからバージョンを削除する


cargo yank --vers 1.0.1 # 1.0.1バージョンを取り下げ
cargo yank --vers 1.0.1 --undo # 取り下げの取り消し

取り下げは、コードの削除は一切しません
例えば、誤ってテストコードにアップロードされた秘密鍵を削除することはできません。もしやってしまったら秘密鍵を再作成しなければなりません。


ワークスペースで巨大なプロジェクトを体系化する

複数のクレートを含むディレクトリに,Cargo.tomlファイルを作成し、以下のような記述をすると、ディレクトリ下のクレート複数をまとめてcargo buildでビルドできるようになります。

[workspace]

members = [
    "adder",
    "add-one",
]

ワークスペース外部のクレートに依存する

通常の外部のクレートを使用するのと同様に記述すれば、ワークスペースで使用するバージョンが一致するように依存関係を解決してくれます。

[dependencies]

rand = "0.3.14"


ワークスペース中の特定のクレートのテストを実行する

cargo test -p add-one

crates.ioからバイナリをインストールする

cargo installコマンドにより、バイナリクレートをローカルにインストールし、使用することができます。

cargo install rur # rur:Universal Robotsを動作させるクレート

独自のコマンドを使用してCargoを拡張する

Cargoは変更する必要なく、新しいサブコマンドで拡張できるように設計されています。 $PATHにあるバイナリがcargo-somethingという名前なら、cargo somethingを実行することで、 Cargoのサブコマンドであるかのように実行することができます。このような独自のコマンドは、 cargo listを実行すると、列挙もされます。cargo installを使用して拡張をインストールし、 それから組み込みのCargoツール同様に実行できることは、Cargoの設計上の非常に便利な恩恵です!


参考資料

https://doc.rust-jp.rs/book-ja/ch14-00-more-about-cargo.html


ご清聴ありがとうございました

Select a repo