Как игнорировать каталог node_modules/с ограниченным набором пакетов во время установки npm?

У меня есть репозиторий, содержащий package.json, который содержит зависимые области. У меня также есть файл .npmignore, предназначенный для белого списка всех файлов и подкаталогов в dist/. Проблема заключается в том, что все зависимые от области действия включены при запуске npm install @private/a другого репозитория. Это включает как частные пакеты npm, так и общедоступные пакеты, такие как @uirouter.

package.json:

   {
      "name": "@private/a",
      "version": "1.0.0",
      "description": "",
      "main": "dist/index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "repository": {
        "type": "git",
        "url": "git+ssh://[email protected]/private/a.git"
      },
      "author": "",
      "license": "ISC",
      "homepage": "https://bitbucket.org/private/a#readme",
      "devDependencies": {
        "gulp": "^3.9.1",
        "gulp-angular-embed-templates": "^2.3.0",
        "gulp-concat": "^2.6.1",
        "gulp-jshint": "^2.0.4",
        "gulp-rename": "^1.2.2",
        "gulp-sass": "^3.0.0",
        "gulp-uglify": "^2.0.0",
        "jshint": "^2.9.4"
      },
      "dependencies": {
        "@private/b": "^1.0.0",
        "@private/c": "^1.0.0"
      }
    }

.npmignore

**
!dist/**

Несмотря на эти два файла, когда я запускаю npm install @private/a --save в другом репозитории, он устанавливает зависимость вместе со всеми ее зависимыми зависимостями:

/node_modules/@private/a/dist/index.js
/node_modules/dist/css/styles.css
/node_modules/@private/a/node_modules/@private/b
/node_modules/@private/a/node_modules/@private/c
package.json

Это должно быть только следующее:

/node_modules/@private/a/dist/index.js
/node_modules/dist/css/styles.css
package.json

Как я могу это достичь? Я пробовал разные варианты .npmignore, но мне не повезло.

Ответ 1

.npmignore не имеет никакого отношения к тому, что вы пытаетесь сделать. Этот файл только решает, какие части вашего кода пакета npm попадают в реестр npm. Поэтому он работает как рекламируемый.

Ваша проблема должна быть в вашем npmconfig или из-за использования более старой версии npm. Последняя версия устанавливает материал так:

/node_modules/@private/a/dist/index.js
/node_modules/@private/b/...
/node_modules/@private/c/...
package.json

Я проверил, что это происходит с последней версией npm. Но было время, когда npm устанавливала зависимости во вложенную структуру. См. это, например,. Поэтому я предлагаю:

  • Убедитесь, что у вас есть последние node и npm.
  • Убедитесь, что ваша конфигурация npm не приводит к устаревшему пакету. Запустите npm get legacy-bundling. Убедитесь, что это неверно.

Есть несколько случаев, когда вложение зависимостей происходит законно даже с последней версией npm. См. . Но я предполагаю, что ваша проблема связана не с этим. Вы можете протестировать, просто сделав npm install @private/a в пустой папке.

Ответ 2

Node установит ваши файлы пакетов вместе со всеми зависимостями, объявленными в поле dependencies.

Как создается дерево зависимостей, зависит от того, какую версию npm вы используете.

Если вашему пакету не нужны эти зависимости для запуска, это означает, что они являются только зависимыми от разработчиков, и вы можете смело перечислить их в поле devDependencies.

зависимости Dev устанавливаются только при запуске npm install внутри каталога плагинов.

Ответ 3

Вам нужно заблокировать свою зависимость. Возможно, вы захотите проверить npm shrinkwrap.