如何在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议:
- 确保你有最新的节点和NPM。
- 确保您的npmconfiguration不会强制传统捆绑。 运行
npm get legacy-bundling
。 确保这是错误的。
即使是最新的npm,依赖关系的嵌套也是合法的。 看到这个 但我猜你的问题不是由于这个。 你可以通过简单地在一个空文件夹中做npm install @private/a
来testing。
节点将安装你的软件包文件以及依赖dependencies
域下声明的所有dependencies
。
如何构build依赖关系树取决于您使用的是哪个版本的npm
。
如果您的软件包不需要这些依赖关系来运行,这意味着它们只是开发依赖关系,您可以安全地列出它们在devDependencies
字段下。
只有在插件目录中运行npm install
时,才会安装开发依赖项。
你需要locking你的依赖。 你可能想看看npm shrinkwrap
。