cli icon indicating copy to clipboard operation
cli copied to clipboard

[BUG] Problems for `npm ci` on a docker image starting v8.11.0

Open nfroidure opened this issue 3 years ago • 2 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

This issue exists in the latest npm version

  • [X] I am using the latest npm

Current Behavior

For the following package.json:

{
  "name": "application",
  "version": "1.18.1",
  "private": true,
  "scripts": {
    "commit": "commit",
    "dev": "NODE_ENV=development NEXT_PUBLIC_APP_ENV=local NEXT_PUBLIC_APP_VERSION=$(node -e 'console.log(require(\"./package.json\").version)') next dev",
    "build": "next build",
    "start": "NODE_ENV=production next start",
    "export": "next export",
    "type-check": "tsc --pretty --noEmit",
    "format": "prettier --write **/*.{ts,tsx}",
    "lint": "eslint . --ext ts --ext tsx --ext js",
    "jest": "TZ=utc LC_ALL='en_US.UTF-8' LC_MESSAGES='en_US.UTF-8' LANGUAGE='en_US' LANG='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' jest",
    "prettier": "prettier --write",
    "pre-commit": "lint-staged && npm run test && npm run type-check && npm run format",
    "prepare": "husky install || echo 'Running in production mode.'",
    "test": "npm run jest",
    "test:watch": "npm run jest -- --watch",
    "test:ci": "npm run jest -- --ci",
    "test:all": "npm lint && npm type-check && npm test",
    "storybook": "start-storybook -p 6006 -s public",
    "build-storybook": "build-storybook -s public",
    "deploy-storybook": "storybook-to-ghpages"
  },
  "dependencies": {
    "@react-hook/merged-ref": "^1.3.2",
    "@rehooks/local-storage": "^2.4.4",
    "@types/cookie": "^0.5.1",
    "@types/js-cookie": "^3.0.2",
    "@types/ms": "^0.7.31",
    "@types/node": "^17.0.36",
    "@types/react": "^18.0.9",
    "@types/react-table": "^7.7.12",
    "@types/uuid": "^8.3.4",
    "axios": "^0.27.2",
    "compressorjs": "^1.1.1",
    "cookie": "^0.5.0",
    "inline-style-prefixer": "^6.0.1",
    "js-cookie": "^3.0.1",
    "jwt-decode": "^3.1.2",
    "luxon": "^2.4.0",
    "ms": "^2.1.3",
    "next": "12.1.6",
    "next-i18next": "^11.0.0",
    "react": "18.1.0",
    "react-dom": "18.1.0",
    "react-hook-form": "7.31.3",
    "react-table": "^7.8.0",
    "recharts": "^2.1.10",
    "swr": "^1.3.0",
    "throttle-debounce": "^3.0.1",
    "type-fest": "^2.13.0",
    "uuid": "^8.3.2",
    "yerror": "^6.1.1"
  },
  "overrides": {
    "openapi-ts-sdk-builder": {
      "@apidevtools/swagger-parser": {
        "ajv": "8.5.0"
      }
    },
    "recharts": {
      "react": "^18.0.0",
      "react-dom": "^18.0.0"
    }
  },
  "devDependencies": {
    "@commitlint/cli": "^17.0.2",
    "@commitlint/config-conventional": "^17.0.2",
    "@commitlint/prompt-cli": "^17.0.0",
    "@storybook/addon-essentials": "^6.5.6",
    "@storybook/addons": "^6.5.6",
    "@storybook/react": "^6.5.6",
    "@storybook/storybook-deployer": "^2.8.11",
    "@testing-library/jest-dom": "^5.16.4",
    "@testing-library/react": "^13.3.0",
    "@types/jest": "^27.5.1",
    "@types/luxon": "^2.3.2",
    "@types/react-test-renderer": "^18.0.0",
    "@types/throttle-debounce": "^5.0.0",
    "@typescript-eslint/eslint-plugin": "^5.27.0",
    "@typescript-eslint/parser": "^5.27.0",
    "babel-jest": "^28.1.0",
    "babel-loader": "^8.2.5",
    "eslint": "^8.16.0",
    "eslint-config-next": "^12.1.6",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-react": "^7.30.0",
    "fork-ts-checker-webpack-plugin": "7.2.11",
    "husky": "^8.0.1",
    "identity-obj-proxy": "^3.0.0",
    "jest": "^28.1.0",
    "jest-environment-jsdom": "^28.1.0",
    "lint-staged": "^13.0.0",
    "openapi-ts-sdk-builder": "^4.0.0",
    "prettier": "^2.6.2",
    "react-test-renderer": "^18.1.0",
    "storybook-addon-next-router": "^4.0.0",
    "ts-loader": "^9.3.0",
    "typescript": "^4.7.2"
  },
  "lint-staged": {
    "*.@(ts|tsx)": [
      "npm run lint",
      "npm run format"
    ]
  },
  "eslintConfig": {
    "parser": "@typescript-eslint/parser",
    "plugins": [
      "@typescript-eslint"
    ],
    "rules": {
      "react/prop-types": "off"
    },
    "extends": [
      "eslint:recommended",
      "plugin:react/recommended",
      "plugin:@typescript-eslint/recommended"
    ],
    "env": {
      "es6": true,
      "browser": true,
      "jest": true,
      "node": true
    }
  },
  "babel": {
    "presets": [
      "next/babel"
    ]
  },
  "prettier": {
    "semi": true,
    "printWidth": 80,
    "singleQuote": true,
    "trailingComma": "all",
    "proseWrap": "always"
  }
}

Doing npm i, then docker build the following dockerfile:

FROM node:16-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm i -g [email protected]
RUN npm ci

Result in the following error:

Cannot read properties of null (reading 'children')

The full stack found in logs is:

52 verbose stack TypeError: Cannot read properties of null (reading 'children')
52 verbose stack     at CanPlaceDep.checkCanPlaceCurrent (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js:253:35)
52 verbose stack     at CanPlaceDep.checkCanPlace (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js:157:27)
52 verbose stack     at new CanPlaceDep (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js:114:26)
52 verbose stack     at PlaceDep.place (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/place-dep.js:123:19)
52 verbose stack     at new PlaceDep (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/place-dep.js:73:10)
52 verbose stack     at /usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:990:31
52 verbose stack     at Array.map (<anonymous>)
52 verbose stack     at Arborist.[buildDepStep] (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:990:8)
52 verbose stack     at async Arborist.buildIdealTree (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:218:7)
52 verbose stack     at async CI.exec (/usr/local/lib/node_modules/npm/lib/commands/ci.js:54:5)

Adding those logs before the failing lines:

  console.log('DEP',dep);
  console.log('NODE', entryNode);
  console.log('PARENT', dep.parent);

Gives: DEP ArboristNode {#] | idealTree:app: timing idealTree:#root Completed in 1ms name: 'react', version: '17.0.2', location: '', path: '/app/node_modules/react-resize-detector/node_modules/react', resolved: 'https://registry.npmjs.org/react/-/react-17.0.2.tgz', extraneous: true, dev: true, optional: true, peer: true, isProjectRoot: true, overrides: Map(4) { 'react' => '^18.0.0', 'react-dom' => '^18.0.0', 'recharts' => '', 'openapi-ts-sdk-builder' => '' }, edgesOut: Map(2) { 'loose-envify' => { prod loose-envify@^1.1.0 MISSING }, 'object-assign' => { prod object-assign@^4.1.1 MISSING } } } NODE ArboristNode { name: 'react', version: '18.1.0', location: 'node_modules/react', path: '/app/node_modules/react', resolved: 'https://registry.npmjs.org/react/-/react-18.1.0.tgz', overrides: Map(2) { 'openapi-ts-sdk-builder' => '', 'recharts' => '' }, edgesOut: Map(1) { 'loose-envify' => { prod loose-envify@^1.1.0 -> node_modules/loose-envify } }, edgesIn: Set(48) { { "" prod [email protected] }, { node_modules/@react-hook/merged-ref peer react@>=16.8 }, { node_modules/@rehooks/local-storage peer react@>=16.8.0 }, { node_modules/@storybook/addon-actions peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-actions/node_modules/react-inspector peer react@^16.8.4 || ^17.0.0 INVALID }, { node_modules/@storybook/addon-backgrounds peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-controls peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-docs peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-docs/node_modules/@mdx-js/react peer react@^16.13.1 || ^17.0.0 INVALID }, { node_modules/@storybook/addon-measure peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-outline peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-toolbars peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addon-viewport peerOptional react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/addons peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/api peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/builder-webpack4 peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/client-api peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/components peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/core peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/core-client peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/core-common peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/core-server peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/manager-webpack4 peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/preview-web peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/react peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/react/node_modules/react-element-to-jsx-string peer react@^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 INVALID }, { node_modules/@storybook/router peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/source-loader peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/store peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/theming peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@storybook/ui peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/@testing-library/react peer react@^18.0.0 }, { node_modules/next peer react@^17.0.2 || ^18.0.0-0 }, { node_modules/next-i18next peer react@>= 16.8.0 }, { node_modules/react-dom peer react@^18.1.0 }, { node_modules/react-hook-form peer react@^16.8.0 || ^17 || ^18 }, { node_modules/react-i18next peer react@>= 16.8.0 }, { node_modules/react-resize-detector peer react@^16.0.0 || ^17.0.0 INVALID }, { node_modules/react-shallow-renderer peer react@^16.0.0 || ^17.0.0 || ^18.0.0 }, { node_modules/react-smooth peer react@^15.0.0 || ^16.0.0 || ^17.0.0 INVALID }, { node_modules/react-syntax-highlighter peer react@>= 0.14.0 }, { node_modules/react-table peer react@^16.8.3 || ^17.0.0-0 || ^18.0.0 }, { node_modules/react-test-renderer peer react@^18.1.0 }, { node_modules/react-transition-group peer react@>=15.0.0 }, { node_modules/recharts peer react@^16.0.0 || ^17.0.0 }, { node_modules/storybook-addon-next-router peer react@^16.8.0 || ^17.0.0 || ^18.0.0 }, { node_modules/styled-jsx peer react@>= 16.8.0 || 17.x.x || ^18.0.0-0 }, { node_modules/swr peer react@^16.11.0 || ^17.0.0 || ^18.0.0 } } } PARENT null

Expected Behavior

Should just install correctly

Steps To Reproduce

See explanations

Environment

  • npm: 8.1.0 but tried on recenter versions
  • Node.js: v16.15.1
  • OS Name: Ubuntu / Alpine for Docker
  • System Model Name:
  • npm config:
; node bin location = /usr/local/bin/node
; node version = v16.15.1
; npm local prefix = /app
; npm version = 8.11.0
; cwd = /app
; HOME = /root
; Run `npm config ls -l` to show all defaults.

Using NPM v8.5.0 solves the issue.

nfroidure avatar Jun 09 '22 15:06 nfroidure

We have the same problem with npm i, with the exact same stack trace.

Environment

npm: 8.11.0 node: 16.15.1 OS: Windows 10

qotsa2002 avatar Jul 27 '22 09:07 qotsa2002

Same issue with npm 8.15 also

ursnj avatar Aug 10 '22 02:08 ursnj

same issue

770 verbose stack TypeError: Cannot read properties of null (reading 'children') 770 verbose stack at CanPlaceDep.checkCanPlaceCurrent (C:\Users\hjagatheesan\AppData\Roaming\nvm\v16.17.1\node_modules\npm\node_modules@npmcli\arborist\lib\can-place-dep.js:253:35) 770 verbose stack at CanPlaceDep.checkCanPlace (C:\Users\hjagatheesan\AppData\Roaming\nvm\v16.17.1\node_modules\npm\node_modules@npmcli\arborist\lib\can-place-dep.js:157:27) 770 verbose stack at new CanPlaceDep (C:\Users\hjagatheesan\AppData\Roaming\nvm\v16.17.1\node_modules\npm\node_modules@npmcli\arborist\lib\can-place-dep.js:114:26) 770 verbose stack at PlaceDep.place (C:\Users\hjagatheesan\AppData\Roaming\nvm\v16.17.1\node_modules\npm\node_modules@npmcli\arborist\lib\place-dep.js:123:19) 770 verbose stack at new PlaceDep (C:\Users\hjagatheesan\AppData\Roaming\nvm\v16.17.1\node_modules\npm\node_modules@npmcli\arborist\lib\place-dep.js:73:10)

hjagatheesan avatar Oct 20 '22 09:10 hjagatheesan

Same Issue. downgrading to 8.5.0 helps. or having the newest version and enabling legacy-peer-deps (seems to be the issue there)

Ikaly avatar Oct 24 '22 15:10 Ikaly

This tree has a conflict between react ^18.2.0 and ^18.1.0, and so you either need to use dependencies that have the same peer deps, or use --legacy-peer-deps.

fritzy avatar Mar 20 '23 18:03 fritzy

My solution was:

https://stackoverflow.com/questions/73933728/how-to-tell-expo-to-install-npm-dependencies-with-legacy-peerdeps-option

leonardovp avatar Feb 21 '24 16:02 leonardovp