[{"data":1,"prerenderedAt":436},["ShallowReactive",2],{"content-/deploy-script-setup":3,"all-pages-for-dir":414,"related-/deploy-script-setup":415,"og-image-/deploy-script-setup":435},{"id":4,"title":5,"body":6,"category":398,"concepts":398,"description":399,"extension":400,"meta":401,"navigation":402,"ogImage":398,"path":403,"project_name":398,"published":404,"publishedAt":405,"seo":406,"source":398,"stem":407,"tags":408,"todo":398,"unpublished":404,"updatedAt":405,"__hash__":413},"pages/2025-12/2025-12-01/deploy-script-setup.md","Cloudflareデプロイの自動化スクリプト追加",{"type":7,"value":8,"toc":382},"minimark",[9,13,17,21,56,59,62,72,76,142,145,157,160,186,190,194,201,246,249,266,269,276,282,285,291,295,305,319,325,328,353,356,378],[10,11,5],"h1",{"id":12},"cloudflareデプロイの自動化スクリプト追加",[14,15,16],"h2",{"id":16},"課題",[18,19,20],"p",{},"以前は Cloudflare Pages へのデプロイに2つのコマンドを順番に実行する必要があった：",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-bash shiki shiki-themes vitesse-light vitesse-light","pnpm build\nwrangler pages deploy\n","bash","",[29,30,31,44],"code",{"__ignoreMap":27},[32,33,36,40],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"senZ8","pnpm",[32,41,43],{"class":42},"sdGka"," build\n",[32,45,47,50,53],{"class":34,"line":46},2,[32,48,49],{"class":38},"wrangler",[32,51,52],{"class":42}," pages",[32,54,55],{"class":42}," deploy\n",[18,57,58],{},"これが面倒なので、1コマンドで実行できるようにしたい。",[14,60,61],{"id":61},"解決方法",[18,63,64,67,68,71],{},[29,65,66],{},"apps/web/package.json"," の ",[29,69,70],{},"scripts"," セクションに新しいスクリプトを追加した。",[73,74,75],"h3",{"id":75},"追加したスクリプト",[22,77,81],{"className":78,"code":79,"language":80,"meta":27,"style":27},"language-json shiki shiki-themes vitesse-light vitesse-light","{\n  \"scripts\": {\n    \"deploy:cloudflare\": \"pnpm build && wrangler pages deploy\"\n  }\n}\n","json",[29,82,83,89,107,130,136],{"__ignoreMap":27},[32,84,85],{"class":34,"line":35},[32,86,88],{"class":87},"shFtX","{\n",[32,90,91,95,98,101,104],{"class":34,"line":46},[32,92,94],{"class":93},"sqvqQ","  \"",[32,96,70],{"class":97},"sz8Xr",[32,99,100],{"class":93},"\"",[32,102,103],{"class":87},":",[32,105,106],{"class":87}," {\n",[32,108,110,113,116,118,120,124,127],{"class":34,"line":109},3,[32,111,112],{"class":93},"    \"",[32,114,115],{"class":97},"deploy:cloudflare",[32,117,100],{"class":93},[32,119,103],{"class":87},[32,121,123],{"class":122},"sMJiu"," \"",[32,125,126],{"class":42},"pnpm build && wrangler pages deploy",[32,128,129],{"class":122},"\"\n",[32,131,133],{"class":34,"line":132},4,[32,134,135],{"class":87},"  }\n",[32,137,139],{"class":34,"line":138},5,[32,140,141],{"class":87},"}\n",[73,143,144],{"id":144},"使い方",[22,146,148],{"className":24,"code":147,"language":26,"meta":27,"style":27},"pnpm deploy:cloudflare\n",[29,149,150],{"__ignoreMap":27},[32,151,152,154],{"class":34,"line":35},[32,153,39],{"class":38},[32,155,156],{"class":42}," deploy:cloudflare\n",[18,158,159],{},"このコマンド1つで以下が順番に実行される：",[161,162,163,170,180],"ol",{},[164,165,166,169],"li",{},[29,167,168],{},"pnpm build"," - Nuxt アプリケーションをビルド",[164,171,172,175,176,179],{},[29,173,174],{},"postbuild"," フック - ",[29,177,178],{},"node scripts/fix-routes.mjs"," が自動実行される",[164,181,182,185],{},[29,183,184],{},"wrangler pages deploy"," - Cloudflare Pages にデプロイ",[14,187,189],{"id":188},"注意点pnpm-の組み込みコマンドとの衝突","注意点：pnpm の組み込みコマンドとの衝突",[73,191,193],{"id":192},"最初の試み失敗","最初の試み（失敗）",[18,195,196,197,200],{},"当初、スクリプト名を ",[29,198,199],{},"deploy"," にしていた：",[22,202,204],{"className":78,"code":203,"language":80,"meta":27,"style":27},"{\n  \"scripts\": {\n    \"deploy\": \"pnpm build && wrangler pages deploy\"\n  }\n}\n",[29,205,206,210,222,238,242],{"__ignoreMap":27},[32,207,208],{"class":34,"line":35},[32,209,88],{"class":87},[32,211,212,214,216,218,220],{"class":34,"line":46},[32,213,94],{"class":93},[32,215,70],{"class":97},[32,217,100],{"class":93},[32,219,103],{"class":87},[32,221,106],{"class":87},[32,223,224,226,228,230,232,234,236],{"class":34,"line":109},[32,225,112],{"class":93},[32,227,199],{"class":97},[32,229,100],{"class":93},[32,231,103],{"class":87},[32,233,123],{"class":122},[32,235,126],{"class":42},[32,237,129],{"class":122},[32,239,240],{"class":34,"line":132},[32,241,135],{"class":87},[32,243,244],{"class":34,"line":138},[32,245,141],{"class":87},[73,247,248],{"id":248},"発生したエラー",[22,250,252],{"className":24,"code":251,"language":26,"meta":27,"style":27},"pnpm deploy\n# ERR_PNPM_CANNOT_DEPLOY  A deploy is only possible from inside a workspace\n",[29,253,254,260],{"__ignoreMap":27},[32,255,256,258],{"class":34,"line":35},[32,257,39],{"class":38},[32,259,55],{"class":42},[32,261,262],{"class":34,"line":46},[32,263,265],{"class":264},"sxvE3","# ERR_PNPM_CANNOT_DEPLOY  A deploy is only possible from inside a workspace\n",[73,267,268],{"id":268},"原因",[18,270,271,272,275],{},"pnpm には ",[29,273,274],{},"pnpm deploy"," という組み込みコマンドがあり、これはmonorepoのワークスペースをデプロイするための特殊なコマンドです。",[18,277,278,279,281],{},"カスタムスクリプトとして ",[29,280,199],{}," という名前を使うと、pnpm の組み込みコマンドと衝突してしまう。",[73,283,284],{"id":284},"解決策",[18,286,287,288,290],{},"スクリプト名を ",[29,289,115],{}," に変更することで、衝突を回避した。",[14,292,294],{"id":293},"代替案pnpm-run-を使う方法","代替案：pnpm run を使う方法",[18,296,297,298,300,301,304],{},"もし ",[29,299,199],{}," という名前をどうしても使いたい場合は、以下のように明示的に ",[29,302,303],{},"run"," を付けることでカスタムスクリプトを実行できる：",[22,306,308],{"className":24,"code":307,"language":26,"meta":27,"style":27},"pnpm run deploy\n",[29,309,310],{"__ignoreMap":27},[32,311,312,314,317],{"class":34,"line":35},[32,313,39],{"class":38},[32,315,316],{"class":42}," run",[32,318,55],{"class":42},[18,320,321,322,324],{},"ただし、混乱を避けるために ",[29,323,115],{}," のように明示的な名前を使う方が推奨される。",[14,326,327],{"id":327},"メリット",[161,329,330,337,343],{},[164,331,332,336],{},[333,334,335],"strong",{},"操作の簡略化"," - 2コマンド → 1コマンドに",[164,338,339,342],{},[333,340,341],{},"ミスの削減"," - ビルドとデプロイの順序を間違えない",[164,344,345,348,349,352],{},[333,346,347],{},"安全性"," - ",[29,350,351],{},"&&"," を使っているため、ビルドに失敗した場合はデプロイが実行されない",[14,354,355],{"id":355},"参考",[357,358,359,371],"ul",{},[164,360,361,362,364,365],{},"pnpm の組み込み ",[29,363,199],{}," コマンドについて: ",[366,367,368],"a",{"href":368,"rel":369},"https://pnpm.io/cli/deploy",[370],"nofollow",[164,372,373,374],{},"package.json の scripts フィールド: ",[366,375,376],{"href":376,"rel":377},"https://docs.npmjs.com/cli/v10/configuring-npm/package-json#scripts",[370],[379,380,381],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sqvqQ, html code.shiki .sqvqQ{--shiki-default:#99841877;--shiki-dark:#99841877}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}",{"title":27,"searchDepth":46,"depth":46,"links":383},[384,385,389,395,396,397],{"id":16,"depth":46,"text":16},{"id":61,"depth":46,"text":61,"children":386},[387,388],{"id":75,"depth":109,"text":75},{"id":144,"depth":109,"text":144},{"id":188,"depth":46,"text":189,"children":390},[391,392,393,394],{"id":192,"depth":109,"text":193},{"id":248,"depth":109,"text":248},{"id":268,"depth":109,"text":268},{"id":284,"depth":109,"text":284},{"id":293,"depth":46,"text":294},{"id":327,"depth":46,"text":327},{"id":355,"depth":46,"text":355},null,"pnpm build と wrangler pages deploy を1コマンドで実行できるように package.json にスクリプトを追加した手順と注意点","md",{},true,"/deploy-script-setup",false,"2025-12-01T00:00:00.000Z",{"title":5,"description":399},"2025-12/2025-12-01/deploy-script-setup",[409,410,411,412,39],"nuxt","cloudflare","deployment","automation","7qW3GLsRw4A0c8BuUHLTaDicVAh29xRXEyJY9_gLB74",[],[416,420,424,427,431],{"title":417,"path":418,"publishedAt":419},"Cloudflare Pages デプロイエラー解決：_routes.json の100文字制限対応","/cloudflare-pages-routes-100-char-limit-fix","2025-11-26T00:00:00.000Z",{"title":421,"path":422,"publishedAt":423},"Cloudflare PagesとWorkers Static Assetsの違い、エッジキャッシュが効く仕組み","/cloudflare-pages-workers-static-assets","2026-07-22T00:00:00.000Z",{"title":425,"path":426,"publishedAt":423},"Webサービスの技術構成 2026年版 — Vue.js/Nuxt/Astroの使い分けとその理由","/web-tech-stack-2026",{"title":428,"path":429,"publishedAt":430},"Cloudflare Pages はもう Workers の中に住んでいる ― Static Assets 統合後の地図","/cloudflare-pages-to-workers-static-assets","2026-06-29T00:00:00.000Z",{"title":432,"path":433,"publishedAt":434},"Nuxt の pnpm generate を measure-deploy.ps1 でフェーズ別に計測した","/nuxt-build-deploy-time-measurement","2026-06-04T00:00:00.000Z","https://log.eurekapu.com/og/blog/deploy-script-setup.png?v=2025-12-01T00%3A00%3A00.000Z&title=Cloudflare%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%BF%BD%E5%8A%A0&author=Kei%20Komatsu&sig=ef71aac862218e24",1785654964685]