<style>
/* basic design */
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
text-align: left;
line-height: 1.6;
letter-spacing: normal;
text-shadow: none;
word-wrap: break-word;
color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #2980b9;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2;}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
width: 90%;
padding: 0.5vw 0 0.5vw 6.0vw;
font-style: italic;
background: #f5f5f5;
}
.reveal blockquote:before{
position: absolute;
top: 0.1vw;
left: 1vw;
content: "\f10d";
font-family: FontAwesome;
color: #2980b9;
font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 5.0vw;}
.reveal h2 {font-size: 4.0vw;}
.reveal h3 {font-size: 2.8vw;}
.reveal h4 {font-size: 2.6vw;}
.reveal h5 {font-size: 2.4vw;}
.reveal h6 {font-size: 2.2vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;}
.reveal code {font-size: 1.6vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
</style>
<style>
/* specific design */
.reveal h2 {
padding: 0 1.5vw;
margin: 0.0vw 0 2.0vw -2.0vw;
border-left: solid 1.2vw #2980b9;
border-bottom: solid 0.8vw #d7d7d7;
}
</style>
<!-- --------------------------------------------------------------------------------------- -->
# Rust勉強会 第14回
## 14章
### 2020/10/23 岡本拓海
---
## 本日のメニュー
1. リリースプロファイルでビルドをカスタマイズする
1. crates.ioでライブラリを公開する
1. ワークスペースで巨大なプロジェクトを体系化する
1. crates.ioからバイナリをインストールする
1. 独自のコマンドを使用してCargoを拡張する
プレゼン20分くらい+議論10分位で18:30前後終了を目指します。
---
## リリースプロファイルでビルドをカスタマイズする
Rustのビルドプロファイル
- devプロファイル
- 通常```cargo build```で生成される
- 開発用途
- release プロファイル
- ```cargo build --release```で生成
- リリース用
----
## ビルドのカスタマイズ
**Cargo.toml**ファイルで最適化設定をカスタマイズできます。
```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を自動で生成してくれます
```rust=
/// 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'''を走らせた時ドキュメンテーションコメントにコードが含まれていると、そのコードも自動でテストしてくれます。
```rust=
/// 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をエクスポートする
これを
```rust
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をエクスポートする
こうじゃ
```rust
pub use kinds::PrimaryColor;
pub use kinds::SecondaryColor;
pub use utils::mix;
pub mod kinds {
// --snip--
}
pub mod utils {
// --snip--
}
```
----
## pub useで便利な公開APIをエクスポートする
するとこうなる
```rust
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アカウントで作れる
3. https://crates.io/me/ でアカウント設定に行き、APIキーを取得
4. 以下のコマンドでcrates.ioにログインする
```bash
cargo login some_like_your_api_key
```
----
## クレートにメタデータを追加する
以下のように最低限のメタデータを追加します
```toml
[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に自分のクレートを公開できます!!
```bash
cargo publish
```
https://crates.io/dashboard を見ると自分の公開したクレートが表示されているはずです。
----
## 既存のクレートの新バージョンを公開する
> クレートに変更を行い、新バージョンをリリースする準備ができたら、 Cargo.tomlファイルに指定されたversionの値を変更し、再公開します。 セマンティックバージョンルールを使用して加えた変更の種類に基づいて次の適切なバージョン番号を決定してください。 そして、cargo publishを実行し、新バージョンをアップロードします。
----
## cargo yankでCrates.ioからバージョンを削除する
``` bash
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"
```
----
## ワークスペース中の特定のクレートのテストを実行する
```bash
cargo test -p add-one
```
---
## crates.ioからバイナリをインストールする
cargo installコマンドにより、バイナリクレートをローカルにインストールし、使用することができます。
```bash
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
---
# ご清聴ありがとうございました
{"metaMigratedAt":"2023-06-15T15:19:08.102Z","metaMigratedFrom":"YAML","title":"第14回 14章","breaks":true,"description":"Rust勉強会第14回のスライド","slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"none\",\"keyboard\":true}","contributors":"[{\"id\":\"610cfd52-ad2b-46e8-81e2-a79a85a7f06f\",\"add\":11755,\"del\":4530}]"}