如何忽略范围包' npm安装期间的node_modules /目录?

时间:2017-06-08 01:59:58

标签: node.js 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://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/**

尽管我在另一个存储库中运行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的不同变体,但没有运气。

3 个答案:

答案 0 :(得分:3)

.npmignore与您要做的事情无关。此文件仅决定npm包代码的哪些部分在npm注册表中结束。所以它正如宣传的那样工作。

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

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

我已经确认这是最新的npm。但是曾经有一段时间npm将依赖项安装到嵌套结构中。见this for example。所以我建议:

  1. 确保您拥有最新节点和npm。
  2. 确保您的npm配置不会强制传统捆绑。运行npm get legacy-bundling。确保这是错误的。
  3. 在极少数情况下,即使使用最新的npm,依赖项的嵌套也会合法地发生。见this。但我猜你的问题不是由于这个原因。您只需在空文件夹中执行npm install @private/a即可进行测试。

答案 1 :(得分:2)

Node将安装您的包文件以及在dependencies字段下声明的所有依赖项。

如何构建依赖项树,取决于您使用的npm版本。

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

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

答案 2 :(得分:1)

您需要锁定您的依赖项。您可能需要查看npm shrinkwrap