运行 pnpm prune --production 导致 nuxt prepare 报错

154 阅读1分钟

最近使用dockerfile 对 nuxt3项目的ssr模式进行构建。

原本的思路是构建结束后,使用pnpm prune --production把开发依赖给删除,但是会触发nuxt prepare钩子提示我某个开发依赖没有安装,但我都构建结束,已经不需要开发依赖了。

FROM node:18-alpine as builder

WORKDIR /app

COPY package*.json ./
COPY pnpm-lock.yaml ./

RUN npx pnpm install --frozen-lockfile

COPY . .

RUN npx pnpm run build

RUN pnpm prune --production

image.png

后来我尝试删除node_modules,只安装生产依赖,却发现依然会触发nuxt prepare钩子

RUN rm -rf node_modules
RUN npx pnpm install --frozen-lockfile

但是在生产构建的时候没有执行过pnpm i,直接下载生产依赖,却不会触发nuxt prepare

FROM node:18-alpine as production

WORKDIR /app

COPY --from=builder /app/pnpm-lock.yaml ./
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/.output ./.output

RUN npx  pnpm install --frozen-lockfile --production

EXPOSE 80

CMD ["node", ".output/server/index.mjs"]

可见只要执行加载nuxt ,脚本就会记录在内存中,删除node_modules也没有用,使用--ignore-scripts忽略脚本,即可解决nuxt prepare钩子的问题

#==================构建=======================
FROM node:18-alpine as builder

WORKDIR /app

COPY package*.json ./
COPY pnpm-lock.yaml ./

RUN npx pnpm install --frozen-lockfile

COPY . .

RUN npx pnpm run build

RUN npx pnpm prune --production --ignore-scripts

#==================生产=======================

FROM node:18-alpine as production

WORKDIR /app

COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.output ./.output

EXPOSE 80

CMD ["node", ".output/server/index.mjs"]