見出し画像

Rust and WebAssembly Hello World! でつまづいた話

#みんなのフォトギャラリーから拝借しましたが、この子、大丈夫だったのかな・・・?

Rust の book Rust and WebAssembly を読みはじめました。が、通常ならばスンナリ通るはずの Hello World! で早速つまづきました。環境は WSL2 上の Ubunt 20.04 です。

まず結論

cargo generate する前に、 ~/.cargo/config.toml に以下を追記。

[net]
git-fetch-with-cli = true

経緯

4. Tutorial -> 4.1. Setup の手順どおり、 wasm-pack をインストール、下記コマンドで generate パッケージをインストールしました。

cargo install cargo-generate

続いて、 4. Tutorial -> 4.2. Hello World! にて、サンプル環境(テンプレート)を利用してプロジェクトを作成する手順となります。以下のコマンドでプロジェクトが作成されるはずでした。

cargo generate --git https://github.com/rustwasm/wasm-pack-template

が、以下のようなエラーが出力され、プロジェクトは作成出来ませんでした。

$ cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project
🔧   Creating project called `my-project`...

[net]
warning: spurious network error (2 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
warning: spurious network error (1 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
Error: ⛔   Git Error: failed to clone into: /mnt/c/Users/foo/work/rust/WASM/4.2/my-projecttXdv9v

調べてみると、この件は Github cargo-generate の issue として報告されていました。スレッドの、このコメントに、冒頭の Work Around について記載されていました。

# Failure
cargo generate --git https://github.com/rustwasm/wasm-pack-template
Project Name: projectName
Creating project called `projectName`...
warning: spurious network error (2 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
warning: spurious network error (1 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
Error:  Git Error: failed to clone into: /some/dir

# Create or edit the cargo config
vim ~/.cargo/config.toml

# Paste the following
[net]
git-fetch-with-cli = true

# Try again
cargo generate --git https://github.com/rustwasm/wasm-pack-template

自分の環境にはまだ config.toml はなかったので新規作成し、 cargo generate が正常動作することを確認しました。無事 Hello World! で js.alert することが出来ました。

git-fetch-with-cli

The Cargo Book3.6. config には以下の記載があります。

net.git-fetch-with-cli
・Type: boolean
・Default: false
・Environment: CARGO_NET_GIT_FETCH_WITH_CLI
If this is true, then Cargo will use the git executable to fetch registry indexes and git dependencies. If false, then it uses a built-in git library.

true の場合、Cargogit 実行ファイルを使用する、false の場合は組み込み git を使用する、とあります。 cargo generate と組み込み git は相性が悪かったのでしょうかね。

おわりに

最後まで読んでいただき、ありがとうございました。

いいなと思ったら応援しよう!