这是令人困惑的,所以我道歉,如果我没有足够的话。
实际上,我利用npm
的--force
标志来绕过与npm@8
冲突的对等依赖项错误。依赖项的后续npm install
完成,没有任何错误。但是,当尝试通过docker安装依赖项时,原始错误返回。
因此,最初:
1.遇到错误:
npm ERR! ERESOLVE could not resolve
...
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
1.通过npm install --force
旁路
1.后续npm install
在新的本地环境中正常工作(例如,克隆到新目录,运行npm install
)
但是,尝试在Docker构建中执行npm install
或npm ci
(npm ci
确保锁定文件已存在)会继续引发原始错误:
npm ERR! ERESOLVE could not resolve
...
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
在我看来,这意味着锁文件没有得到尊重,但我们知道它存在,因为否则npm ci
会出错。
有人知道为什么会这样吗?
我正在测试的Dockerfile:
# // Dockerfile
# ==== CONFIGURE =====
# Use a Node 16 base image
FROM node:16-alpine
# Set the working directory to /app inside the container
WORKDIR /app
# Copy app files
COPY package-lock.json .
RUN echo $(ls)
# ==== BUILD =====
# Install dependencies (npm ci makes sure the exact versions in the lockfile gets installed)
RUN npm ci
# Build the app
RUN npm run build
# ==== RUN =======
# Set the env to "production"
ENV NODE_ENV production
# Expose the port on which the app will be running (3000 is the default that `serve` uses)
EXPOSE 3000
# Start the app
CMD [ "npx", "serve", "build" ]
1条答案
按热度按时间z4iuyo4d1#
本地npm是v8.1,docker npm是v8.19。似乎他们在这两个版本之间的某个时候引入了一个突破性的变化。
从official docs开始:
注:如果您通过运行npm install来创建package-lock.json文件,并使用可能影响依赖关系树形状的标志(例如--legacy-peer-deps或--install-links),则必须为npm ci提供相同的标志,否则可能会遇到错误。npm配置设置legacy-peer-deps = true--location = project并将. npmrc文件提交到您的存储库。