如何在npm安装期间忽略scoped软件包的node_modules /目录?

我有一个存储库,其中包含一个包含作用域依赖关系的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://git@bitbucket.org/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/** 

尽pipe这两个文件,当我运行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不同变化,但没有任何运气。

.npmignore与你所要做的无关。 这个文件只能决定npm包代码的哪一部分在npmregistry中。 所以它正在广告中工作。

您的问题必须在您的npmconfig中,或者因为使用了旧版本的npm。 最新版本安装的东西是这样的:

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

我已经证实,这是最新的NPM发生。 但是曾经有一段时间,npm将依赖关系安装到嵌套结构中。 看到这个例子 。 所以我build议:

  1. 确保你有最新的节点和NPM。
  2. 确保您的npmconfiguration不会强制传统捆绑。 运行npm get legacy-bundling 。 确保这是错误的。

即使是最新的npm,依赖关系的嵌套也是合法的。 看到这个 但我猜你的问题不是由于这个。 你可以通过简单地在一个空文件夹中做npm install @private/a来testing。

节点将安装你的软件包文件以及依赖dependencies域下声明的所有dependencies

如何构build依赖关系树取决于您使用的是哪个版本的npm

如果您的软件包不需要这些依赖关系来运行,这意味着它们只是开发依赖关系,您可以安全地列出它们在devDependencies字段下。

只有在插件目录中运行npm install时,才会安装开发依赖项。

你需要locking你的依赖。 你可能想看看npm shrinkwrap