[{"data":1,"prerenderedAt":432},["ShallowReactive",2],{"content-/nuxt-content-db-lock-and-auto-import-conflict":3,"related-/nuxt-content-db-lock-and-auto-import-conflict":384,"all-pages-for-dir":430,"og-image-/nuxt-content-db-lock-and-auto-import-conflict":431},{"id":4,"title":5,"body":6,"category":367,"description":368,"extension":369,"meta":370,"navigation":342,"path":371,"project_name":372,"published":373,"publishedAt":374,"seo":375,"stem":376,"tags":377,"todo":382,"unpublished":373,"updatedAt":382,"__hash__":383},"pages/2026-06/2026-06-13/nuxt-content-db-lock-and-auto-import-conflict.md","Nuxt Content の database lock と auto-import 衝突によるビルドエラー - dev起動失敗から measure-deploy で再発するまでの2連続",{"type":7,"value":8,"toc":355},"minimark",[9,14,35,42,46,49,68,74,77,101,108,111,122,125,129,152,159,162,176,184,188,195,205,218,230,237,241,244,260,270,273,277,280,300,303,321,328,331],[10,11,13],"h2",{"id":12},"きっかけdev-server-を立てたら-nuxtcontent-がスタックトレースを吐いた","きっかけ：dev server を立てたら @nuxt/content がスタックトレースを吐いた",[15,16,17,18,22,23,26,27,30,31,34],"p",{},"朝、",[19,20,21],"code",{},"pnpm dev"," を叩いたら起動ログの中に ",[19,24,25],{},"@nuxt/content"," のスタックトレースが混じった。",[19,28,29],{},"module.mjs:359"," で database write が転んでいる。ブラウザで ",[19,32,33],{},"localhost:3000"," を開くとページは出るけれど、コンソールには database lock 系の警告が並んで気持ちが悪い。",[15,36,37,38,41],{},"最初は「@nuxt/content のバグかな」と思いかけたが、dev server 自体は ",[19,39,40],{},"port 3000"," で立ち上がって PID 41280 として動いている。プロセスは生きていてキャッシュ書き込みだけ転んでいる、というちぐはぐな状態だった。",[10,43,45],{"id":44},"原因を掘り当てる裏で-pnpm-generate-が走り続けていた","原因を掘り当てる：裏で pnpm generate が走り続けていた",[15,47,48],{},"落ち着いてプロセス一覧を見たら、答えは別のところにあった。",[50,51,52,59,62,65],"ul",{},[53,54,55,58],"li",{},[19,56,57],{},"pnpm generate"," が裏でまだ走っていた（13:25 起動、確認時点で数分経過）",[53,60,61],{},"generate は SSG ビルドで dev cache の SQLite を握る",[53,63,64],{},"そこに dev server が同じ SQLite に書き込みに行って locked になっていた",[53,66,67],{},"ついでに Playwright の test-server の残骸が 2 本残っていた",[15,69,70,71,73],{},"generate を途中で殺すか完走を待つかで迷ったが、約10分の処理がもう数分進んでいたので完走させる判断に倒した。",[19,72,57],{}," の所要時間が読めるからこそできる判断で、ここで殺して再度回すと結局10分待つことになる。",[10,75,76],{"id":76},"動かしたフロー",[78,79,80,83,86,89,92,98],"ol",{},[53,81,82],{},"generate を完走させる（PID 8808 / 35300 が消えるのを待つ）",[53,84,85],{},"並列で、auto-import 衝突回避用のファイル修正を先に進める（generate には影響しない）",[53,87,88],{},"generate 完走後、別の dev server (PID 44420) が port 3000 で起動済みなのを確認",[53,90,91],{},"PID 44420 を停止（PID 0 は Windows の Idle Process なので無視）",[53,93,94,97],{},[19,95,96],{},".nuxt"," 配下の dev cache を削除",[53,99,100],{},"dev server をクリーン再起動",[15,102,103,104,107],{},"PowerShell でプロセスを止めるとき、最初に bash の Heredoc に ",[19,105,106],{},"$"," を直書きしたら bash 側で展開されて空になった。シングルクォートで囲み直して通した。Windows + Git Bash + PowerShell が混ざる環境のいつもの落とし穴で、毎回引っかかる。",[10,109,110],{"id":110},"結果と副次的な発見",[50,112,113,116,119],{},[53,114,115],{},"dev cache を消した状態で起動し直したら、database lock の警告は全消えした",[53,117,118],{},"Vitest で 17331 件のテストを回したところ、自分の修正と無関係な tokibo の noindex テストが 2 件失敗した（既存の問題で、今日の作業とは別件）",[53,120,121],{},"修正に関するテストは全部 pass",[15,123,124],{},"ここで一旦区切って、関連する別の片付け作業に移った。",[10,126,128],{"id":127},"同じセッションでやった片付けdeg_to_rad-の降格","同じセッションでやった片付け：DEG_TO_RAD の降格",[15,130,131,132,135,136,139,140,143,144,147,148,151],{},"dev server をクリーン再起動するついでに、",[19,133,134],{},"app/utils/analemma-claude.ts"," の ",[19,137,138],{},"DEG_TO_RAD"," / ",[19,141,142],{},"RAD_TO_DEG"," を ",[19,145,146],{},"export const"," から内部 ",[19,149,150],{},"const"," に降格させた。",[15,153,154,155,158],{},"Nuxt の ",[19,156,157],{},"app/utils/**"," は auto-import 対象で、同じ名前の定数を別ファイルから export していると衝突する可能性がある。今回、別の analemma 系ファイルでも同名の定数を持つ必要が出てきたので、auto-import 対象から外して内部 const にした。",[15,160,161],{},"降格しても安全か確認した手順:",[50,163,164,173],{},[53,165,166,167,169,170,172],{},"テストファイルは ",[19,168,138],{}," も ",[19,171,142],{}," も明示 import していない",[53,174,175],{},"なら降格しても影響範囲はない、と判断した",[15,177,178,179,183],{},"ここで安心したのが",[180,181,182],"strong",{},"まずかった","。あとで二発目を食らうことになる。",[10,185,187],{"id":186},"二発目measure-deployps1-がビルドエラーで止まった","二発目：measure-deploy.ps1 がビルドエラーで止まった",[15,189,190,191,194],{},"15時43分、",[19,192,193],{},"powershell -ExecutionPolicy Bypass -File scripts/measure-deploy.ps1"," を回したら、ビルド途中で止まった。",[196,197,202],"pre",{"className":198,"code":200,"language":201},[199],"language-text","DEG_TO_RAD is not exported by app/utils/analemma-claude.ts\n","text",[19,203,200],{"__ignoreMap":204},"",[15,206,207,208,210,211,143,214,217],{},"降格させたばかりの ",[19,209,138],{}," を「is not exported」と言われている。意味が一瞬わからなかったが、直近コミット ",[19,212,213],{},"67575b4f",[19,215,216],{},"git show"," させたら答えが出てきた。",[15,219,220,229],{},[180,221,222,225,226,228],{},[19,223,224],{},"app/pages/blog/analemma-claude.vue"," 側で ",[19,227,138],{}," を明示 import していた。"," これを更新し忘れていた。",[15,231,232,233,236],{},"朝の確認では「テストファイルは明示 import していない」までしか見ていなくて、",[180,234,235],{},"ページ側の明示 import を確認しそびれていた","。Nuxt の auto-import を意識して utils 側ばかり見ていたのが盲点だった。",[10,238,240],{"id":239},"対応の判断1案を捨てて2案を採った","対応の判断：1案を捨てて2案を採った",[15,242,243],{},"選択肢は2つあった。",[78,245,246,255],{},[53,247,248,254],{},[180,249,250,251,253],{},"降格を撤回して ",[19,252,146],{}," に戻す",": ビルドは通るが、重複 export 警告が出る可能性があり、降格コミットの意図に逆行する",[53,256,257],{},[180,258,259],{},"ページ側の明示 import を整理して、ページ内で必要な定数を直接定義し直す",[15,261,262,263,266,267,269],{},"採ったのは2案。",[19,264,265],{},"apps/web/app/pages/blog/analemma-claude.vue"," 側での ",[19,268,138],{}," 使用は185-186行目の2箇所だけで、ページ内で完結させたほうが依存関係が浅くなる。降格の意図（auto-import 衝突回避）も保てる。",[15,271,272],{},"修正後にビルドを回し直したら通った。",[10,274,276],{"id":275},"学びexport-const-内部-const-降格は参照側を全部洗わないと事故る","学び：「export const → 内部 const 降格」は参照側を全部洗わないと事故る",[15,278,279],{},"今回の二発目は、auto-import 衝突を避けるために export を引っ込めた副作用そのものだった。",[50,281,282,287,293],{},[53,283,154,284,286],{},[19,285,157],{}," は auto-import 対象なので、export を外すと「auto-import を使っている呼び出し側」は IDE / Vue ファイルで即エラーになり気づきやすい",[53,288,289,292],{},[180,290,291],{},"危ないのは「明示 import しているファイル」のほう","。auto-import に頼っていないので静的解析で目立ちにくく、ビルドして初めて落ちる",[53,294,295,296,299],{},"テストファイルだけ確認して安心したのが甘かった。ページコンポーネント・他の utils・composable・scripts まで ",[19,297,298],{},"grep -r \"DEG_TO_RAD\" apps/web/app"," で洗うべきだった",[15,301,302],{},"降格コミットを作るときの手順としてはこう固めた:",[78,304,305,312,315,318],{},[53,306,307,308,311],{},"降格対象シンボルを ",[19,309,310],{},"grep -r"," で全参照箇所を出す（テストだけでなくページ・composable も）",[53,313,314],{},"auto-import 経由か明示 import かを分類する",[53,316,317],{},"明示 import 側は降格コミットと同じコミットで更新する",[53,319,320],{},"ビルドを1回通してから push する（dev での確認だけで安心しない）",[15,322,323,324,327],{},"朝の database lock のほうも併せて教訓を1個。",[180,325,326],{},"「複数の重い裏プロセスが同じリソースを握っていないか」を、エラーログの内容より先に疑う癖をつける","。@nuxt/content のスタックトレースが派手だったので原因が module 側にあると思いかけたが、実際はモノレポ内で2本の pnpm プロセスが SQLite を奪い合っていただけだった。",[10,329,330],{"id":330},"このあと残った宿題",[50,332,335,349],{"className":333},[334],"contains-task-list",[53,336,339,344,345,348],{"className":337},[338],"task-list-item",[340,341],"input",{"disabled":342,"type":343},true,"checkbox"," 降格・export 削除をする系の作業に、参照側の grep を必ず挟むチェックリストを ",[19,346,347],{},".claude/rules/"," のどこかに残す",[53,350,352,354],{"className":351},[338],[340,353],{"disabled":342,"type":343}," tokibo の noindex テスト 2 件失敗は既存問題として別途調査する",{"title":204,"searchDepth":356,"depth":356,"links":357},2,[358,359,360,361,362,363,364,365,366],{"id":12,"depth":356,"text":13},{"id":44,"depth":356,"text":45},{"id":76,"depth":356,"text":76},{"id":110,"depth":356,"text":110},{"id":127,"depth":356,"text":128},{"id":186,"depth":356,"text":187},{"id":239,"depth":356,"text":240},{"id":275,"depth":356,"text":276},{"id":330,"depth":356,"text":330},"dev","dev server 起動時に @nuxt/content が SQLite を握れず落ちた。裏で pnpm generate が走っていたのが真因。さらに同じ日の午後、auto-import 衝突を避けるため export const を内部 const に降格させたら、明示 import していたページ側を直し忘れて measure-deploy.ps1 がビルドエラーで止まった。","md",{},"/nuxt-content-db-lock-and-auto-import-conflict","mdx-playground",false,"2026-06-13T00:00:00.000Z",{"title":5,"description":368},"2026-06/2026-06-13/nuxt-content-db-lock-and-auto-import-conflict",[378,25,379,380,381],"Nuxt","auto-import","ビルドエラー","SQLite",null,"Jdnv7TWyYQ7dJgdPPmowybKcJx_Zhcdp7GjNZvca1uM",[385,395,402,413,421],{"title":386,"description":387,"path":388,"tags":389,"publishedAt":394,"updatedAt":382},"Nuxt SSGビルドエラーを3つ潰して本番デプロイを復旧した","Cloudflare Pagesで2月22日以降の記事が消えていた原因を追い、importパスの階層不足・Date型のsplit問題・未コミットコンテンツの3つを修正して本番復旧した記録","/nuxt-ssg-build-fix-2026-03-05",[378,390,391,380,392,393],"SSG","Vite","Cloudflare Pages","トラブルシューティング","2026-03-05T00:00:00.000Z",{"title":396,"description":397,"path":398,"tags":399,"publishedAt":401,"updatedAt":382},"@nuxt/content「UNIQUE constraint failed: _content_pages.__hash__」エラーの原因と解決策","Nuxt devサーバー起動時に発生するSQLiteのUNIQUE制約エラーの原因調査と解決方法。コンテンツファイル削除後にキャッシュが残ることで発生する問題を解説。","/nuxt-content-sqlite-unique-constraint",[378,400,381,393],"nuxt-content","2026-01-06T00:00:00.000Z",{"title":403,"description":404,"path":405,"tags":406,"publishedAt":412,"updatedAt":412},"SQLiteから財務データを読み込む実装方針","koyfin.dbに格納された財務データをVueページで表示するための実装アプローチ比較","/sqlite-financial-data-implementation",[407,408,409,410,411],"sqlite","nuxt","financial-data","api","architecture","2025-12-12T00:00:00.000Z",{"title":414,"description":415,"path":416,"tags":417,"publishedAt":420,"updatedAt":420},"Nuxt Content v3：D1データベースは本当に必要なのか？","wrangler.tomlにD1を設定しているのに、実際には使われていなかった事実。Nuxt Content v3のSQLiteデータフローを正確に理解する","/nuxt-content-d1-not-used",[408,400,418,407,419,411],"D1","cloudflare","2025-12-05T00:00:00.000Z",{"title":422,"description":423,"path":424,"tags":425,"publishedAt":429,"updatedAt":429},"Nuxt Content + Pages ハイブリッドアーキテクチャ：プロジェクト要件定義書","Nuxt Content（Markdown + SQLite）とNuxt Pages（Vue）を組み合わせたハイブリッドCMSアーキテクチャの完全ガイド。新規プロジェクトとしてゼロから構築するための要件定義を含む","/nuxt-hybrid-content-architecture",[408,426,427,411,428,407],"content","pages","requirements","2025-11-29T00:00:00.000Z",[],"https://log.eurekapu.com/og/blog/nuxt-content-db-lock-and-auto-import-conflict.png?v=2026-06-13T00%3A00%3A00.000Z&title=Nuxt%20Content%20%E3%81%AE%20database%20lock%20%E3%81%A8%20auto-import%20%E8%A1%9D%E7%AA%81%E3%81%AB%E3%82%88%E3%82%8B%E3%83%93%E3%83%AB%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC%20-%20dev%E8%B5%B7%E5%8B%95%E5%A4%B1%E6%95%97%E3%81%8B%E3%82%89%20measure-deploy%20%E3%81%A7%E5%86%8D%E7%99%BA%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE2%E9%80%A3%E7%B6%9A&author=Kei%20Komatsu&sig=501fcf7355417c12",1781423423076]