npm ci 只能安装已存在 package-lock.json 或 npm-shrinkwrap.json 的包,并且 lockfileVersion >= 1。

74

当我在GitHub Action文件中运行npm ci命令安装依赖时,我遇到了这个问题。

我正在处理一个expo托管应用程序,并使用GitHub Actions作为CI,在每次将代码推送到developmemt分支时触发构建。

这是我的构建脚本:

name: EAS PIPELINE
on:
  push:
    branches:
      - development
  workflow_dispatch:

jobs:
  build:
    name: Install and build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false

      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: 14.x

      - name: Setup Expo
        uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
          token: ${{ secrets.EXPO_TOKEN }}
          expo-cache: true

      - name: Install dependencies
        run: npm ci

      - name: Build on EAS
        run: EAS_BUILD_AUTOCOMMIT=${{1}} npx eas-cli build --platform all --non-interactive

我遇到的问题在于安装依赖步骤。

Run npm ci
  npm ci
  shell: /usr/bin/bash -e {0}
  env:
    EXPO_TOKEN: ***
npm ERR! cipm can only install packages with an existing package-lock.json or npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or later to generate it, then try again.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/runner/.npm/_logs/2021-10-28T15_16_06_934Z-debug.log
Error: Process completed with exit code 1.
18个回答

44
经过大量的研究,我发现这种情况是由于没有使用“npm install”安装依赖项导致的。在我的情况下,我只使用了yarn来安装依赖项,因此只有“yarn.lock”文件而没有“package-lock.json”文件。
解决这个问题的一种方法是使用“npm install”安装依赖项,然后您将拥有一个“package-lock.json”文件,“CI”就不会抛出任何错误了。
另一种方法是,如果您只想使用“yarn”,那么您需要更新“eas-pipeline.yml”文件中安装依赖项的步骤。
*****************************************************************************************

      - name: Install dependencies
        run: |
          if [ -e yarn.lock ]; then
          yarn install --frozen-lockfile
          elif [ -e package-lock.json ]; then
          npm ci
          else
          npm i
          fi

***************************************************************************************

由于我在StackOverflow上找不到任何解决方案,而这是我们寻求任何问题的首选地方。因此,我决定在此处撰写答案。

以下是原始答案:https://github.com/facebook/docusaurus/issues/2846#issuecomment-691706184


5
除非你想编写一个适用于多种情况的一般安装脚本,否则最好使用 yarn 或 npm 中的一个而不是混合使用两者。如果你在本地使用 npm install ,请在 CI 中使用 yarn install --frozen-lockfile - rethab

38

我遇到了类似的错误:

`npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` before continuing.

出现了一堆缺失的依赖项名称,随后出现了这个错误。

我在本地运行 npm ci 时,它可以成功运行。然而,在 CI 流水线中运行 npm ci 时,它会给我上面的错误,我的情况是因为 Jenkins 流水线运行环境中安装的 Node.js 版本不同。

我的本地 Node 版本是 16.x,而 Jenkins 容器中的版本是 12.x。

升级它就解决了问题。


2
我们也遇到了同样的问题。我猜测 npm 的新版本在检查兼容性时变得更加严格了。我们正在使用 overrides,但是一些开发人员没有安装尊重 package.json 中 overrides 的 npm 版本。 - StriplingWarrior
1
我也遇到了同样的问题。在 GitHub Actions 中,npm 版本 8 和 8.5 之间似乎有些东西会以与您相同的方式破坏构建。在我的情况下,将 node-version: '17.9.0' 指定到工作流中,它使用 npm 8.5.5 来修复了这个问题。感谢您提供的信息。 - user115014
1
这里发生了同样的事情,我有16.3.2,而CI是16 :shrug: - ncubica
将我的 Node.js 版本降级到 16.0.0 对我起了作用。 - Rex Omiv
我有一个类似的经历。在我的开发环境中,我安装了node 16.14.0和npm 8.3.1,并运行了npm install。CI服务器上安装了node 16.17.1和npm 8.15.0。因此,在npm 8.3和8.15之间发生了一些变化。我将我的开发环境升级到与CI环境相同的版本,然后成功构建了项目。 - John Jeffery
我也遇到了类似的问题。 我的本地设置使用的是npm版本~7.18.1,而CI管道使用的是更高版本。 强制CI管道使用npm 7.18.1解决了这个问题。 - sdkcodes

27

我也遇到了同样的问题,但是很长时间都无法弄清楚原因。后来发现我全局设置了legacy-peer-deps=true,而我自己并不知情。

这使得我的npm install命令以一种方式更改了package-lock.json,导致我们的CI服务器构建失败。我用master中的版本重置了package-lock.json,去掉了那个npm配置,并重新安装了依赖。之后一切都正常了。


就我和我的团队而言,这是导致问题的原因。移除或禁用 legacy-peer-deps 设置使得我的本地环境像 CI 一样。感谢 Spencer。 - Zander
5
谢谢,这正是我的问题。我在我的 .npmrc 文件中设置了 legacy-peer-deps=true - Andrew Winter
我浪费了数小时时间寻找错误的原因,结果发现是这个。你真是救命恩人!更像是节省时间的恩人!哈哈。谢谢! - Xander Selorm
很不幸在自己解决之前我没有找到这个。值得一提的是,对于任何其他npm设置也是如此,它们必须相同。 - liakoyras

23

似乎您的 package.json 和 package-lock.json 不同步。

尝试运行此命令 npm install --package-lock-only。它将生成与您的 package.json 同步的 package-lock.json 文件。


确保 package.json 和 package-lock.json 同步是最简单的解决方案,所以虽然可能不适用于每个人,但这是我首先尝试的方法。我删除了我的 package-lock.json,然后运行了 npm install,之后 npm ci 就正常工作了。 - Robert Bracco

12

虽然这是一篇旧文章,但我在查找同样的错误时找到了这个。在我的情况下,我的根目录中确实有一个package-lock.json文件。然而,在打开它时,我发现在先前的合并冲突期间出现了JSON语法错误。重新运行npm i后,文件被修复了。在那种情况下,npm ERR!'npm ci'命令只能使用现有的package-lock.json进行安装并不是非常有用的错误提示。


1
同意,刚刚经历了这个问题。如果npm能够警告检测到无法解析的package-lock.json文件,那就更好了。 - Nabil Freeman

9
我在AWS Amplify上苦苦挣扎了大约5个小时,因为我的package-lock.json和package.json没有同步;无论我如何修改自己的代码都无法解决这个问题(即使删除package-lock.json),最终起作用的是在Amplify页面的Build Settings选项卡中更改App构建规范中的preBuild设置。
我的yml文件最终看起来像这样:
version: 1
frontend:
  phases:
    preBuild:
      commands:
        - npm install --package-lock-only
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: build
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*

值得注意的是,与默认设置唯一的区别在于包括 -npm install --package-lock-only 以同步 AWS 中的文件。也许有些显而易见,但我卡了几个小时,希望能帮助到其他人。


1
谢谢,那正是我所面临的问题。 - Rutvik Gumasana
1
谢谢,伙计。本地 Docker 环境也一样。 - Sergey Romanchuk
1
确认这对我也起作用了 - 谢谢你 - undefined
这个在几分钟内完美地运作。非常感谢。你真棒,@Nathaniel。 - undefined

3
在我的情况下,当我尝试将其部署到Firebase时,遇到了相同的问题。当我运行firebase deploy --only functions时,它会产生这个错误,并且无法正确部署函数。我尝试了这里的所有步骤。删除package-lock.json然后运行npm i没有起作用。使用节点版本管理器(nvm)升级然后降级我的节点版本也没有起作用。
最终起作用的是删除package-lock.json文件,然后不运行npm install。当我运行firebase deploy --only functions时,它成功部署了。 请注意:尽管这个解决方案对我有效,但可能会在后续出现其他问题。

这个列表里除了这个以外,其他的都对我没用。谢谢。前一晚我成功部署了,然后一个小改动引发了所有这些问题。 - undefined

3

在经过大约两天的奋斗后,成功将其部署到 Firebase Functions 上,方法是从 srcsrc/functions 文件夹中删除 package-lock.json


3

针对在AWS Amplify上出现此问题的用户,您可能需要运行npm install并提交package-lock.json文件,然后再次部署。


2

出现这个问题的原因是包锁定文件没有使用 npm 生成,尽管 npm ci 要求使用 npm 安装包。 由于 npm 需要 package-lock.json,因此我们会遇到这个错误。为了解决 GitHub actions 的这个错误,我做了以下操作:

    - run: yarn install --frozen-lockfile
    - run: yarn lint
    - run: yarn test:ci

提交差异:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接