Windows版セットアップをPowerShellに全面移行した話 - 開発日記 #2
DMM DB型SEOアフィリエイトサイト構築キットを作っています。
Macでは setup.sh が安定して動いているのですが、Windows版はずっと苦戦していました。今回ようやく根本的な解決策として setup.bat を廃止し、PowerShell版の setup.ps1 に全面移行しました。その経緯と技術的な背景を書きます。
なぜ setup.bat では限界だったのか
setup.bat(バッチファイル)はWindowsの古いコマンドプロンプト用の形式です。長年使われてきた枯れた技術ですが、今回のキットには不向きでした。理由は3つです。
1. JSON パースができない
Supabase CLIやGitHub CLIは、コマンドの出力をJSON形式で返します。プロジェクトIDやAPIキーをそこから取り出す必要があるのですが、バッチファイルにはJSONを扱う仕組みがありません。
最初は findstr や文字列操作でなんとかしようとしましたが、出力フォーマットが少し変わるだけで壊れる、非常に脆い実装になっていました。
2. 文字コードの問題
WindowsのコマンドプロンプトはデフォルトでShift-JIS(CP932)を使います。一方、Node.jsやCLIツールの出力はUTF-8前提のものが多い。この混在が文字化けや、条件分岐の誤動作を引き起こしていました。
3. エラー処理が難しい
バッチファイルはエラーハンドリングの構文が貧弱です。コマンドが失敗しても処理が続いてしまい、あとから「どこで壊れたのか」がわかりにくい状況が続いていました。
PowerShellに移行して解決したこと
setup.ps1(PowerShell版)に切り替えることで、上記の問題がすべて解消されました。
JSONパースは1行で書ける
PowerShellには ConvertFrom-Json というコマンドレットが標準で用意されています。
$projects = supabase projects list --output json | ConvertFrom-Json
$orgId = $projects[0].organization_id
これだけです。バッチファイルで数十行かけても不安定だった処理が、2行で確実に動きます。
文字コードを明示的に指定できる
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$env:PYTHONUTF8 = "1"
冒頭でこれを宣言しておくことで、外部コマンドの出力を常にUTF-8として扱えます。文字化けの問題が根絶されました。
エラー処理が書ける
$ErrorActionPreference = "Stop"
この1行で、コマンドが失敗した瞬間にスクリプトが停止します。どこで問題が起きたかが明確になり、テスターからのフィードバックも「○○のステップでエラーになった」と具体的になりました。
あわせて修正したこと
WindowsのPowerShell移行と並行して、いくつかの細かい不具合も修正しました。
Supabase projects create の --org-id 自動付与
Supabase CLIで新しいプロジェクトを作成する際、--org-id が必要なケースがあります。これを手動で調べて入力してもらうのはハードルが高いので、既存プロジェクト一覧から自動で取得して渡すように変更しました。
バックフィル(初期データ取得)の改善
backfill.mjs でジャンルIDを指定しなくてもフロア人気順で100件取得できるように変更しました。初期設定の手間が減ります。
現在の状況
Mac版(setup.sh)は引き続き安定稼働中。Windows版(setup.ps1)も主要なフローは通るようになってきました。
まだCLIツールのインストール確認部分など、詳細な動作確認が残っています。テスターの方から「ここで詰まった」というフィードバックをいただきながら、引き続き改善していきます。
販売に向けて
このキットはnoteとwp-plugin.netでの販売を予定しています。
現在はクローズドベータテスト中です。テスターとして参加いただいている方、ありがとうございます。引き続きよろしくお願いします。
ベータ版への参加希望、ご意見・ご質問はXのDMまたはnoteのコメントからどうぞ。
#アフィリエイト #SEO #個人開発 #Astro #Supabase #DMM #PowerShell #Windows
