TL; DR
schema.prisma
generator client {
provider = "prisma-client-js"
// ここを追加するだけ
output = "../src/generated/client"
}
// 生成先のパスを参照する
import { PrismaClient } from './generated/client'
概要
Node.jsでバックエンドを書いている
ORMにはPrismaを使っている
インフラは Google App Engine (以下、GAE)を使う
以上の条件のとき、問題が発生したので、その解決策を残す。
問題1 prisma generate しないとクライアントが使えない
prisma のクライアントを使うときは、事前にprisma generateを実行する必要がある。GAE ではインスタンス開始時に npm scripts のstartに設定したコマンドが実行されるので、startを以下のように変更した。
package.json
"scripts": {
"start": "prisma generate && node dist",
}
問題2 GAEのファイルは read only
しかし、GAEのファイルは read only であるため、prisma generateが失敗してしまった。
Error: EROFS: read-only file system, unlink '/workspace/node_modules/.prisma/client/index.js'
解決策
prisma generateの出力先はデフォルトだと、node_modules内だが、GAEはデプロイ時にインスタンス側でnpm installが走り、その後は read only になるため都合が悪い。つまり、出力先を node_modules外に変更できれば、解決する。
公式ドキュメントを読んだところ、↓を見つけた。
https://www.prisma.io/docs/concepts/components/prisma-client/working-with-prismaclient/generating-prisma-client#using-a-custom-output-path
以下のようにすれば解決した。
schema.prisma
generator client {
provider = "prisma-client-js"
// ここを追加
output = "../src/generated/client"
}
PrismaClientをインポートしているコードも書き換えた。
import { PrismaClient } from './generated/client'
最後に
GAE はインフラにかかる工数を大幅に削減できるメリットがあるが、自由度は低い。
ただ、その低い自由度の中でも解決策は案外見つかる。
↧