установка npm как предотвратить вложенные папки node_mocules

#node.js #npm #dependencies #npm-install

#node.js #npm #зависимости #npm-установка

Вопрос:

У меня есть package.json файл, который имеет

 "dependencies": {
 "packageA": "^1.0.0",
  

и у этого package A есть другая зависимость в его package.json

 "dependencies": {
 "packageA_B": "^1.0.0",
  

Затем, если я npm install включу windows 10 , node v11.11.0 у меня в итоге будет

 /node_modules/packageA
/node_modules/packageA/node_modules/packageA_B
  

Затем, если я удалю этот пакет и запущу npm install packageA , я получу

 /node_modules/packageA
/node_modules/packageA_B
  

Это то, что я хочу с самого начала. Почему происходит это несоответствие? Как принудительно установить все пакеты не вложенным способом?

 package.json

{
  "name": "first_package",
  "private": true,
  "description": "",
  "main": "gatsby-config.js",
  "version": "0.2.25",
  "author": "",
  "dependencies": {
    "packageA": "git https://blah.git#h5c8f72",

    "gatsby": "2.1.4",
    "gatsby-plugin-compile-es6-packages": "^1.0.6",
    "gatsby-plugin-offline": "^2.0.24",
    "gatsby-plugin-page-creator": "^2.0.10",
    "gatsby-plugin-react-helmet": "^3.0.8",
    "gatsby-plugin-sharp": "^2.0.25",
    "gatsby-plugin-styled-components": "^3.0.6",
    "gatsby-source-filesystem": "^2.0.23",
    "gatsby-transformer-sharp": "^2.1.15",

    "path": "0.12.7",
    "react": "16.8.6",
    "react-dom": "16.8.6",
    "styled-components": "^4.1.3",
    "styled-icons": "^7.4.2"
  },
  "devDependencies": {
    "babel-eslint": "^10.0",
    "eslint": "^5.16.0",
    "eslint-config-prettier": "^4.1.0",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-prettier": "^3.0.1",
    "eslint-plugin-promise": "^4.1.1",
    "eslint-plugin-react": "^7.12.4",
    "eslint-plugin-standard": "^4.0.0",
    "gulp": "^4.0.0",
    "gulp-help": "^1.6.1",
    "prettier": "^1.16.4"
  },
  "keywords": [
    ""
  ],
  "license": "",
  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "start": "npm run develop",
    "serve": "gatsby serve",
    "test": "echo "Write tests! -> https://gatsby.app/unit-testing""
  },
  "repository": {
    "type": "git",
    "url": "https://"
  },
  "bugs": {
    "url": "https://"
  }
}
  
 Package A package.json

{
  "name": "packageA",
  "private": true,
  "description": "",
  "version": "0.2.25",
  "main": "index.js",
  "author": "",
  "dependencies": {
    "packageA_B": "0.2.25",

    "styled-components": "4.2.0",
    "styled-icons": "7.9.0",
    "babel-plugin-styled-components": "1.10.0",
    "gatsby-plugin-styled-components": "3.0.7",

    "gatsby-plugin-page-creator": "2.0.12",
    "gatsby-source-filesystem": "2.0.28",
    "gatsby-plugin-compile-es6-packages": "1.1.0",
    "path": "0.12.7",
    "esm": "3.2.14",
    "prop-types": "15.7.2",

    "gatsby-plugin-gtag": "1.0.10",
    "gatsby-plugin-manifest": "2.0.26",
    "react-cookie-consent": "2.2.2"
  },
  "peerDependencies": {
    "gatsby": "2.1.4",
    "react": "16.8.6",
    "react-dom": "16.8.6"
  },
  "devDependencies": {
    "gatsby": "2.1.4",
    "react": "16.8.6",
    "react-dom": "16.8.6",

    "babel-eslint": "^10.0",
    "eslint": "^5.16.0",
    "eslint-config-prettier": "^4.1.0",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-prettier": "^3.0.1",
    "eslint-plugin-promise": "^4.1.1",
    "eslint-plugin-react": "^7.12.4",
    "eslint-plugin-standard": "^4.0.0",
    "gulp": "^4.0.0",
    "gulp-help": "^1.6.1",
    "prettier": "^1.16.4"
  },
  "keywords": [
    ""
  ],
  "license": "",
  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "start": "npm run develop",
    "serve": "gatsby serve",
    "test": "echo "Write tests! -> https://gatsby.app/unit-testing""
  },
  "repository": {
    "type": "git",
    "url": ""
  },
  "bugs": {
    "url": ""
  }
}

  
 Package A_B package.json

{
  "name": "packageA_B",
  "version": "0.2.25",
  "description": "",
  "author": "",
  "main": "index.js",
  "license": "",
  "private": false,
  "dependencies": {
    "styled-components": "4.2.0",
    "styled-icons": "7.9.0",
    "babel-plugin-styled-components": "1.10.0",
    "gatsby-plugin-styled-components": "3.0.7",

    "gatsby-plugin-page-creator": "2.0.12",
    "gatsby-source-filesystem": "2.0.28",
    "gatsby-plugin-compile-es6-packages": "1.1.0",
    "path": "0.12.7",
    "esm": "3.2.14",
    "prop-types": "15.7.2",

    "gatsby-mdx": "0.4.2",
    "@mdx-js/mdx": "0.20.3",
    "@mdx-js/tag": "0.20.3",
    "gatsby-image": "2.0.31",
    "gatsby-plugin-offline": "2.0.25",
    "gatsby-plugin-react-helmet": "3.0.11",
    "gatsby-plugin-sharp": "2.0.32",
    "gatsby-transformer-sharp": "2.1.17",
    "react-helmet": "5.2.0",
    "react-share": "2.4.0"
  },
  "peerDependencies": {
    "gatsby": "2.1.4",
    "react": "16.8.6",
    "react-dom": "16.8.6"
  },
  "devDependencies": {
    "gatsby": "2.1.4",
    "react": "16.8.6",
    "react-dom": "16.8.6",

    "babel-eslint": "^10.0",
    "eslint": "^5.16.0",
    "eslint-config-prettier": "^4.1.0",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-prettier": "^3.0.1",
    "eslint-plugin-promise": "^4.1.1",
    "eslint-plugin-react": "^7.12.4",
    "eslint-plugin-standard": "^4.0.0",
    "gulp": "^4.0.0",
    "gulp-help": "^1.6.1",
    "prettier": "^1.16.4"
  },
  "keywords": [
    ""
  ],
  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "start": "npm run develop",
    "serve": "gatsby serve",
    "test": "echo "Write tests! -> https://gatsby.app/unit-testing""
  },
  "repository": {
    "type": "git",
    "url": ""
  },
  "bugs": {
    "url": ""
  }
}

  

Комментарии:

1. Что это за пакеты? Этого не должно произойти, если вы запускаете npm install в корневом каталоге вашего проекта (где package.json находится)

2. Мои пакеты (темы gatsby). Итак, у меня есть пакет A, для которого требуется B, и B, для которого требуется C, если я установлю A, то C вложен в B, где C и B должны быть на одном уровне. Но если я сделаю это npm install A вместо npm install (это зависит от package.json), тогда все будет правильно. Кроме того, если после установки я удаляю их из node_modules , то npm install работает как ожидалось (не вложенный). Почему это происходит в первую очередь? Потому что, если происходит вложение, сайт не работает

3. Пожалуйста, скажите мне точное название пакетов

4. Они являются частными. Я постараюсь сделать их общедоступными, чтобы вы могли воспроизвести это, но не сразу. В любом случае, вы хотите сказать, что то, что я описываю, не должно происходить (?), Поэтому пакеты никогда не должны устанавливаться вложенным способом (?)

5. Точно. Существует проблема с самими пакетами, возможно, в их сценариях установки или последующей установки

Ответ №1:

Решаемая путем указания не точной версии "1.0.0" , а совместимой версии "^1.0.0" . Каким-то образом с точной версией npm не использует пакет, даже если они имеют точно такую же версию. Кроме того, запуск npm dedupe ничего не делает, когда указана точная версия.