公司项目发布生产环境居然遇到报错构建失败,简单查了下报错信息,主要是这个错误导致的:
[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: @parcel/[email protected], [email protected], [email protected], [email protected], [email protected]
Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts.看上去是 pnpm 升级了一套阻止自动执行 preinstall 脚本的二次验证机制,之前不是 Axios 出现过供应链攻击,这次它升级了一个 V11 的大版本,估计就是解决这个问题的。
我们有好几个 DockerFile 对应不同的环境,测试环境正常,因为用了 Node 18 的镜像,而生产则是用了 Node 22,这次 pnpm 的升级 要求最低版本 Node 22,于是只有生产环境构建出错。
起初我想到的解决方法是强行降级 pnpm 到 V10,用 GPT 调整构建流程,改成 npm install pnpm@10 发现并不管用,反复试了好几次,在我的 Mac 电脑上尝试构建,还会遇到 esbuild 报错 /app/node_modules/.bin/../esbuild/bin/esbuild: line 0: syntax error: unterminated quoted string,GPT 说是二进制包的架构有问题,大概率是 COPY 了 node_modules 之后的问题,也没解决,拿实际的 CI 环境去测试了。
后续第二天直接按照报错,给 DockerFile 的步骤里面加了句 pnpm approve-builds 发现就好了,也没任何包需要同意的,挺诡异的。原先我还以为需要增加 --all 属性,因为 官方文档 有写,实际上这个选项是不存在的...
# 修改前
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then npm install -g pnpm && pnpm i; \
else echo "Lockfile not found." && exit 1; \
fi
# 修改后
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then \
corepack enable && \
pnpm approve-builds && \
pnpm i; \
else echo "Lockfile not found." && exit 1; \
fi