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

sak*_*a73 79 continuous-integration npm expo github-actions

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

我正在开发一个博览会管理的应用程序,并用作GitHub ActionsCI 来触发构建,每当我将代码推送到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 Code Online (Sandbox Code Playgroud)

这是我面临的问题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.
Run Code Online (Sandbox Code Playgroud)

sak*_*a73 53

经过大量研究,我发现当您不使用npm install安装依赖项时会发生这种情况。就我而言,我仅使用纱线作为依赖项,因此我只有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

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

Run Code Online (Sandbox Code Playgroud)

由于我无法在 StackOverflow 上找到任何解决方案,因此这是我们查找任何问题的第一个去处。所以,我决定把这个答案写在这里。

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

  • 除非您想编写一些适用于多种场景的通用安装脚本,否则您可能希望坚持使用“yarn”或“npm”,但不要混合使用两者。如果您本地使用 `npm install`,请在 CI 中使用 `yarn install --frozen-lockfile`。 (5认同)

Ege*_*Ege 39

我有一个类似的错误:

`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.
Run Code Online (Sandbox Code Playgroud)

此错误后缺少一堆依赖项名称。

我会npm ci在本地运行,它会成功运行。然而,当在 CI 管道中运行时,它会给我上面的错误npm ci,在我的例子中,这是因为 Jenkins 管道运行的环境中安装的 Node.js 版本不同。

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

升级就修复了。

  • 我们也发生过同样的事情。我推测新版本的“npm”在检查兼容性方面更加严格。我们正在使用“overrides”,而我们的一些开发人员没有支持 package.json 中“overrides”的 npm 版本。 (2认同)

小智 30

同样的事情也发生在我身上,我很长时间也想不通。原来我legacy-peer-deps=true设置的是全局的,我自己也不知道。

这导致我的npm install命令以package-lock.json破坏 CI 服务器上构建的方式进行更改。我重置package-lock.json了版本master,删除了该npm配置,然后重新安装。之后一切工作正常。

  • 谢谢这是我的问题。我的“.npmrc”文件中有“legacy-peer-deps=true”。 (6认同)

小智 25

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

尝试运行这个npm install --package-lock-only。它将生成与您的 package.json 同步的 package-lock.json


DJ *_*use 12

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


小智 9

我在 AWS Amplify 上挣扎了大约 5 个小时,因为显然我的 package-lock.json 和 package.json 没有同步;我对自己的代码没有做任何事情来解决这个问题(甚至删除 package-lock.json),最终起作用的是更改 Amplify 页面的“构建设置”选项卡内的应用程序构建规范内的预构建设置。

我的 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/**/*
Run Code Online (Sandbox Code Playgroud)

值得注意的是,与默认设置的唯一区别是包括-npm install --package-lock-only同步 AWS 内的文件。也许有点明显,但我被困了几个小时,希望我能帮助别人。


Cla*_*les 5

就我而言,我在尝试将其部署到 Firebase 时遇到了同样的问题。当我运行时,firebase deploy --only functions它会产生此错误并且无法正确部署该功能。我尝试了这里的所有步骤。删除package-lock.json然后运行npm i也没用。使用节点版本管理器 (nvm) 升级然后降级我的节点版本不起作用。

效果很好的是删除 package-lock.json 文件并且之后不再运行。 npm install当我运行它时firebase deploy --only functions,它已成功部署。

请注意:虽然这个解决方案对我有用,但它可能会导致其他并发症。