npm ci 只能安装具有现有 package-lock.json 或 npm-shrinkwrap.json 且 lockfileVersion >= 1 的包

npm ci can only install packages with an existing package-lock.json or npm-shrinkwrap.json with lockfileVersion >= 1

这是我在 运行 命令 npm ci 在我的 GitHub 操作文件中安装依赖项时遇到的问题。

我正在开发一个 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

这是我面临的问题 Install dependencies 步骤。

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.

经过大量研究,我发现当您没有使用 npm install 安装依赖项时会发生这种情况。在我的例子中,我只使用 yarn 作为依赖项,所以我只有 yarn.lock 文件而没有 package-lock.json 文件。

  • 解决此问题的一种方法是使用 npm install 安装依赖项,然后您将拥有一个 package-json.lock 文件并且 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

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

因为我无法在 Whosebug 上找到任何解决方案,而这是我们寻找问题的第一个去处。所以,我决定在这里写下这个答案。

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

旧post,但我在搜索同样的错误时发现了这个。在我的例子中,我 did 在我的根目录中有一个 package-lock.json 文件。然而,当打开它时,我意识到在之前的合并冲突中有一个 JSON 语法错误。在 运行 npm i 之后,文件再次修复。在那种情况下,npm ERR! The 'npm ci' command can only install with an existing package-lock.json 并不是一个非常有用的错误。

我遇到了类似的错误。

`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 在本地,它会 运行 成功。但是,当 npm ci 在 CI 管道中为 运行 时,它会给我上面的错误,在我的例子中,这是因为安装在 Node.js 中的版本差异Jenkins 管道 运行 所在的环境。

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

升级已修复。

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

删除 deploy.json 对我有帮助,因为令牌在覆盖时会更新

rm ~/.config/configstore/@vkontakte/vk-miniapps-deploy.json

但我有其他服务