【问题标题】:How to ignore scoped packages' node_modules/ directory during npm install?如何在 npm 安装期间忽略范围包的 node_modules/ 目录?
【发布时间】:2017-11-09 13:31:50
【问题描述】:

我有一个包含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 的不同变体,但没有任何运气。

【问题讨论】:

  • 运行包@private/a 需要@private/b@private/c 吗?
  • 或者它们仅在@private/a 开发和构建期间需要,是吗?

标签: node.js npm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案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。确保这是错误的。

      即使使用最新的 npm,依赖的嵌套也很少发生。见this。但我猜你的问题不是因为这个。您只需在空文件夹中执行npm install @private/a 即可进行测试。

      【讨论】:

      • 这是问题所在,谢谢!我使用的是 npm 版本 3,在版本 5 中这不再是问题。
      猜你喜欢
      • 2018-01-17
      • 2016-10-15
      • 2021-01-19
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      相关资源
      最近更新 更多