【Day23】なんか開発用プログラムとかを作りたいとき【QAC24】


# なんか開発用プログラムとかを作りたいとき

Tauri とは多分関係ないです。

前回までの例を出すと、マップエディターでマップを編集して、それを StoreAPI で JSON としてファイルに保存したのですが、それを実際のマップのファイル (`src/maps/<mapId>.ts`) に変換しなければならないのですが...
手動でやるのはかったるいですよね...？

他にもなんか例えばキャッシュを削除したり、画像データを同期したり...

これらをコマンド 1 つで出来たら便利ですよね。

# Rust-bin

Rust の機能(Cargo の機能)として、メインとなるプロジェクト以外に`bin`というものを使う事で、簡易的に複数プロジェクトをまとめて管理する事が出来ます。
(そもそも Tauri は`lib`として管理されているが私はここら辺は知らんのだ)
(もっと言うと`package`を複数用意すればプロジェクトも増やせるけど)

本来 Cargo ではプロジェクトは 1 つで、`cargo run`ってやったら`src/main.rs`が動きますが、特別なコマンドを使う事で別ファイルを動かせます。

先ずは`src-tauri`に移動しましょう。

```sh
$ cd ./src-tauri
```

## `bin` folder

`src-tauri`の中には Rust が詰まってます。かわいいですね。

更に Rust のプログラムが詰まっている`src`フォルダの中に`bin`フォルダを作りましょう。

```sh
$ mkdir src/bin
```

### file

今回は`hw1.rs`を作ってみましょう。
場所は`src/bin`の下です。

中身は適当に以下のようにしましょう。

```rust
fn main() {
  println!("Hello World from hw1.rs!");
}
```

まぁ何の変哲もない Hello World ですね。

これを`bin`機能で実行してみたいと思います。

```sh
$ cargo run --bin hw1
```

すると、ビルドが挟まり、`Hello World from hw1.rs!`と表示されるはずです。
このように、`src/bin`以下にファイルを置いた場合、`cargo run --bin <ファイル名>`で実行する事が出来ます。

ファイルだけではなくフォルダでも、`cargo run --bin <フォルダ名>`で実行する事が出来ます。
フォルダの場合は、そのフォルダ内の`main.rs`が実行されます。

## Bin target

更に、別途名前を指定することも出来ます。

`Cargo.toml`の中に以下のような記述を加えましょう

```toml
[[bin]]
name = "hw2"
path = "src/bin/harowa.rs"
```

そして`src/bin`に`harowa.rs`を作りましょう。

```rust
fn main() {
  println!("Haro-wa-rudo");
}
```

この状態で`cargo run --bin hw2`を実行すると、`Haro-wa-rudo`と表示されるはずです。

これで、開発用プログラムを実行することが出来そうなのですが、いちいち`src-tauri`に行くの...面倒ですよね。

# Cargo のディレクトリ指定機能

なぜ`src-tauri`に行かなければならなかったのかというと、Cargo では`Cargo.toml`がないと、そこを Rust のプロジェクトフォルダと認識せず、
Cargo のコマンドが使えないからです。

なので、cargo に`src-tauri`を指定してみたいと思います。

`cargo`とだけ入力すると、`-C <DIRECTORY> Change to DIRECTORY before doing anything (nightly-only)`という表記を確認できると思います。
(`cargo 1.79.0 (ffa9cf99a 2024-06-03)`)

これを使って、Rust のプロジェクトフォルダを指定することが出来ます。

```sh
$ cargo -C src-tauri
error: the `-C` flag is unstable, pass `-Z unstable-options` on the nightly channel to enable it
```

なんか言われましたね。

`-C`は安定してないからオプションをさらにつけろって言われてますね。

```sh
$ cargo -Z unstable-options -C src-tauri
error: the `-C` flag is unstable, pass `-Z unstable-options` on the nightly channel to enable it
```

ん？　変わった？
あ、見落としてた。

`on the nightly channel to enable it`とあるように、この`-C`オプションは nightly でしか使えないようです。
なので Nightly を使えるようにしましょう。

> `Nightly` とは、雑に言えば超々開発版のことで、その日の夜(night)にビルドされてたことからそう呼ばれています。

# Nightly を使ういくつかの方法

## Rust Toolchain Nightly

まずは最初のフォルダで`rust-toolchain`というファイルを作りましょう。

そして中身に`nightly`とだけ書きましょう。

```sh
$ echo "nightly" > rust-toolchain
```

これで、そのフォルダ内で`nightly`が使えるようになります。
試しに`cargo -V`を実行してみましょう。

```sh
$ cargo -V
cargo 1.85.0-nightly (652623b77 2024-12-20)
```

Nightly になりましたね。

## `+`オプション

先ほどよりも簡単で、`+nightly`というオプションをつけるだけで Nightly を使うことが出来ます。

```sh
$ cargo +nightly -V
cargo 1.85.0-nightly (652623b77 2024-12-20)
```

これも Nightly になりましたね。

# 回帰

さて、Nightly を使えるようになったので、`-C`オプションを使って`src-tauri`を指定してみましょう。

```sh
$ cargo +nightly -C src-tauri run --bin hw1
```

すると、`Hello World from hw1.rs!`と表示されるはずです。

これで完璧ですね。
あとは JSON ファイルからマップのファイルを作るプログラムを書くだけです。

Rust で JSON を扱うときには以下の方の記事が欲参考になりますのでぜひご覧ください。

[Serde を用いた Rust の json 取り扱いメモ - scirexs | Zenn](https://zenn.dev/scirexs/articles/9bcb013c95ca10)

それではここらで終わりにしましょう。