← ./articles-ja

WindowsでWrangler Pages Deployが落ちる時は非ASCIIのcwdを疑う

Wrangler Pages deploy は、アップロード前に落ちることがあります。

Windowsでは、原因がソースコードでもCloudflare設定でもなく、Wranglerプロセスの作業ディレクトリである場合があります。作業ディレクトリに日本語などの非ASCII文字が含まれると、ネイティブ依存の処理がアップロード前にクラッシュすることがあります。

症状: バージョン表示の直後に止まる

典型的には次の形です。

  • npx wrangler pages deploy out --project-name my-site を実行する
  • Wrangler のバージョン表示は出る
  • upload progress が出ない
  • Git Bashでは Segmentation fault になる
  • PowerShellでは exit code 1 だけになる
  • npm run build は成功している

通常のPagesエラーなら、ファイル読み込み後やCloudflare API応答後に説明が出ます。ここではその前に落ちます。

out/ だけ移動しても直らない理由

出力先だけをASCIIパスにコピーしても、Wrangler自体を元の非ASCIIパスから起動していると落ちることがあります。

deploy対象パスと、プロセスのcurrent working directoryは別です。確認します。

Get-Location
Test-Path out
npx wrangler pages deploy out --project-name my-site

Get-Location に日本語パスが含まれ、upload progress の前に落ちるなら、アプリコードを直す前にcwdを疑います。

ASCIIの一時フォルダから起動して確認する

手動確認はこうです。

$stage = Join-Path $env:TEMP ("wrangler-pages-" + [DateTimeOffset]::Now.ToUnixTimeMilliseconds())
New-Item -ItemType Directory -Path $stage | Out-Null
Copy-Item -Recurse out\* $stage
Push-Location $stage
npx wrangler pages deploy . --project-name my-site
Pop-Location

これで成功するなら、Cloudflareプロジェクトや静的出力ではなく、Wranglerを起動した場所が原因です。

スクリプト化する

毎回手で移動せず、build後にASCIIの一時ディレクトリへコピーし、そこをcwdにしてWranglerを起動します。

const fs = require("fs");
const os = require("os");
const path = require("path");
const { spawnSync } = require("child_process");

const outDir = path.join(process.cwd(), "out");
const stageDir = path.join(os.tmpdir(), `wrangler-pages-${Date.now()}`);

fs.cpSync(outDir, stageDir, { recursive: true });

try {
  const result = spawnSync(
    "npx",
    ["wrangler", "pages", "deploy", ".", "--project-name", "my-site"],
    { cwd: stageDir, stdio: "inherit", shell: process.platform === "win32" },
  );

  process.exitCode = result.status ?? 1;
} finally {
  fs.rmSync(stageDir, { recursive: true, force: true });
}

重要なのは、artifactを移すだけではなく、Wrangler child process のcwdもASCIIパスにすることです。

デプロイ後に確認する

成功表示だけで終わらせず、Cloudflare側と公開URLを確認します。

npx wrangler pages deployment list --project-name my-site
Invoke-WebRequest https://my-site.pages.dev/ -UseBasicParsing

build失敗、Wrangler起動前クラッシュ、Cloudflare APIエラー、公開URLの反映待ちは別物です。まとめて「デプロイ失敗」と扱うと、不要なリトライやコード修正につながります。

参考