Blazor WebAssembly on Cloudflare Pages
TL;DL
リポジトリ
ビルド設定は
| key | value |
|---|---|
| ビルドコマンド | chmod +x build.sh && ./build.sh |
| ビルド出力 | output/wwwroot |
/build.sh
#!/bin/sh
curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh -c 9.0 -InstallDir ./dotnet
./dotnet/dotnet --version
./dotnet/dotnet publish -c Release -o output
参考
経緯
WASMを使ってランダムパスワードジェネレーターを作りたいなと思ったので、このプロジェクトが始まりました。最初はNext.js + WASM(Rust) on Cloudflareしようと思ってました。
create next appして、cloudflare pagesに入れたらnodejs_compatがいるよって言われた。
そこでworkersに入れようと思ったら、純粋なnext.jsとWASMの扱いが違ったので、cloudflareに適したWASMを含むセットアップを探してWranglerにたどり着いた。
ただ、WranglerがWindowsだとうまく動いてくれなかったので、断念。
Windowsのpowershellで動かすとWranglerがC:\みたいなパスはだめだからWSLで動かしてねって言われて、WSLで動かすと「そのファイルパスは許可してないからcmd.exeで実行するね。あとついでにファイルパスは標準の'C:\Windows'以下だよ」って言われて、permissionエラー(当然)で、諦めて退散しました。(ここまで4日かかった)
ということで、私は諦めて、サークルの先輩が使ってたBlazorでWASMを実現することにしました。ほんとはRustを使いたかったんだけど。
手順
使用環境
| key | value |
|---|---|
| IDE | VisualStudio2022 |
| ソースコード管理 | GitHub |
| ライセンス | MIT |
| デプロイ先 | Cloudflare Pages |
Create Blazor Project
VisualStudio(以下VSと略)を起動して新規プロジェクトを作成からBlazor WebAssembly スタンドアロン アプリを選択して、作成。残りはよしなに。
プログレッシブWebアプリケーションって項目があって、何かと思って調べたら、ネイティブアプリみたいに独立したウィンドウとして表示できる機能?みたい。間違ってたらごめんなさい。Next.jsだったかReactでも似たような機能あるよね。アプリとしてインストールってやつ。
Setting up git
VSはgit clientも付いている超優秀な子です。上のツールバーのGit項目にマウスを持っていくと、リポジトリを作るところまでやってくれます。昔はこんな項目があった覚えがないのだけど。
Push to GitHub
上の手順でやると、勝手にコミットメッセージ込みでプッシュしてくれます。しやがります
プロジェクト ファイルを追加します。というコミットメッセージ付きです。日本語コミットメッセージやめて
ただ、VSのデフォルト設定だとmasterブランチが作られます。ただ、近年の差別的な言葉を避ける運動によりmainブランチにしましょうという流れらしいです。
個人的にはbridgeのslaveとか言ったりするし分かり易い表現だと思うので、すべて変える必要があるとは思いませんが、ブランチに関してはmasterでもmainでも可用性に差があるように感じないのでmainブランチにしときます。
Ready for deploy
Cloudflare Pagesにデプロイするために必要な手順がひとつ残っています。
参考に挙げたCloudflareドキュメントCreate the build scriptに書いてあるとおり、ビルド用のスクリプトを書きます。一応再掲。
#!/bin/sh
curl -sSL https://dot.net/v1/dotnet-install.sh > dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh -c 9.0 -InstallDir ./dotnet
./dotnet/dotnet --version
./dotnet/dotnet publish -c Release -o output
なお、4行目の9.0のところは各々が新規プロジェクト作成の際に選択したSDKバージョンを入れてください。
Window上のneovimを使ってこれを書いたところ、なんかバグったので、WSLでnanoやらvimやら使って書くことをおすすめします。
書けたら、そのファイルも含めてGitHubに上げときます。上げるっていうのは含めてコミットするわけで...VSのgit clientはcliにラッパーが被さった程度のものなので、プロジェクトのルートディレクトリ内にスクリプトを置いとけば、Add&Commitする欄に出てくるので、"適当に"コミットメッセージを書いてCommit&&Pushします。
いざDeploy
CloudflareにログインしてDashboardからPages(表示はコンピューティング(Workers))に飛んで、作成を押して、プロジェクトのリポジトリを選択します。
ビルドコマンドのところに"Cloudflareのドキュメント通りに"
| Configuration option | Value |
|---|---|
| Production branch | main |
| Build command | ./build.sh |
| Build directory | output/wwwroot |
| してみます。 |
23:10:29.350 Executing user command: ./build.sh
23:10:29.358 /bin/sh: 1: ./build.sh: Permission denied
23:10:29.359 Failed: Error while executing user command. Exited with error code: 126
23:10:29.366 Failed: build command exited with code: 1
23:10:33.878 Failed: error occurred while running build command
らしいです。そう言えば公式ドキュメントに
Your build.sh file needs to be executable for the build command to work. You can make it so by running chmod +x build.sh.
って書いてありました。ね。
バカの遠回り
バカな私はローカルでls -lしてpermissionを確認し始めました。
-rwxrwxrwx 1 <user> <user> 1094 Jul 28 00:13 LICENSE.txt
-rwxrwxrwx 1 <user> <user> 13 Jul 27 22:36 README.md
-rwxrwxrwx 1 <user> <user> 223 Jul 27 23:12 build.sh
drwxrwxrwx 1 <user> <user> 4096 Jul 27 22:33 webtools-mj
-rwxrwxrwx 1 <user> <user> 1146 Jul 27 22:33 webtools-mj.sln
あれ、おかしいですね、実行権限どころか、他の権限まであるじゃないですか。
なんでだろうなと思いながらchmod +x build.shを実行します。
まあ、何も変わるわけがなくてですね、英語の読み間違いかなと思って日本語に翻訳をかけました。
ビルドコマンドを機能させるには、ファイルが実行可能である必要があります。実行することでそうすることができます.
build.sh chmod +x build.sh
ん?じゃあbuild.sh chmod +x build.shを実行すればいいんだな?と思い、実行しました。
するとどうでしょう、ルートディレクトリ内に.NET SDKがインストールされました!
それをGitHubに上げて、Cloudflareがdeployしようとすると……
既に.NET SDKがあります!ってエラーが。まあ当然ですわな。
それから私は何をトチ狂ったか、インストールされている.NET SDKファイルらを削除してみたり、build.shすら消してみたり色々とやりました。GitHubさん、本当にごめんなさい。
結局は……
そろそろ公式ドキュメントを信用しなくなってきた私はググりました。そして見つけたのです。
Permission denied on build scriptへの回答
The only way would be to change the build command from
./build.shtochmod +x build.sh && ./build.sh
天才か?
つまり、Cloudflareのサーバがgit cloneしてる時点でこっちのファイルのpermissionなんて向こうに関係ないわけでして、そのサーバ内でのpermissionを変更するにはこれしかないという、至極真っ当な答えでしたとさ。
| Configuration option | Value |
|---|---|
| Production branch | main |
| Build command | chmod +x && ./build.sh |
| Build directory | output/wwwroot |
Deployの成功と今後
やっとのことでDeployが成功しましたとさ。
今後は、このWEBページの機能と見た目を開発していけたらいいなと思ってます。
反省
- 公式ドキュメントはきっちり読む(翻訳に頼らずに)
- 公式ドキュメントで詰まったらググってみてもよい
- 無知。よい勉強になりました
以上、長々と、私の右往左往の失敗談でした。
Discussion