代码之家  ›  专栏  ›  技术社区  ›  user1790300

npm安装:有没有办法忽略包中的特定依赖项。json

  •  27
  • user1790300  · 技术社区  · 7 年前

    我目前正在尝试为节点创建docker容器。包含本地依赖项的js项目。这似乎会导致docker出现问题,因此作为一种解决方法,我尝试只复制本地依赖项文件夹,而忽略它们在包中的依赖项。json文件。有没有办法指定我想忽略的依赖项,让npm安装运行并跳过这些实体?

    2 回复  |  直到 7 年前
        1
  •  16
  •   RootHacker    7 年前

    这可以通过使用 devDependencies

    您只需要开发的npm模块,例如:单元测试、Coffeescript到Javascript的转换、缩小等,使所需的模块成为开发依赖。

    跳过devDepenencies pass的安装 --production 标记为 npm install ,使用 标志(或 NODE_ENV 环境变量设置为 production ) npm 不会安装devdependences中列出的模块。"

    npm install --production
    

    要使任何模块成为devdependences的一部分,请在安装时传递-dev。

    npm install packagename --save-dev
    
        2
  •  2
  •   Vadim    5 年前

    这是一个常见的问题,不仅在Docker中,在一些云部署中也是如此。例如,使用标准节点部署到CloudFoundry。js buildpack将导致 npm install / yarn 无论如何都要跑。因此,您还需要应用一些技巧来处理本地模块

    如果您不介意从NPM切换到Yarn进行依赖关系管理,您可以使用 workspaces 特色

    我的 package.json 看起来像这样:

    {
    
      ...
    
      "dependencies": {
        "some-module-i-want-to-install": "1.0.0",
        "another-module-i-want-to-install": "1.0.0",
        "@my/local-dependency-one": "1.0.0",
        "@my/local-dependency-two": "1.0.0"
      },
      "workspaces": ["packages/*"]
    }
    

    我的项目源布局具有以下结构:

    .
    ├── index.js
    ├── package.json
    ├── packages
    │   ├── local-dependency-one
    │   │   ├── index.js
    │   │   └── package.json
    │   └── local-dependency-two
    │       ├── index.js
    │       └── package.json
    └── yarn.lock
    

    运行后 纱线 ,我要安装的模块从NPM注册表中获取,本地依赖项从中安装 packages 目录到 node_modules .

    .
    ├── index.js
    ├── node_modules
    │   ├── @my
    │   │   ├── local-dependency-one
    │   │   │   └── ...
    │   │   └── local-dependency-two
    │   │       └── ...
    │   ├── another-module-i-want-to-install
    │   │   └── ...
    │   └── some-module-i-want-to-install
    │       └── ...
    ├── package.json
    ├── packages
    │   ├── local-dependency-one
    │   │   └── ...
    │   └── local-dependency-two
    │       └── ...
    └── yarn.lock 
    

    如您所见,我更喜欢将我的本地包定义为 scoped ( @my/... ). 这不是强制性的,而是一种最佳做法。NPM将作用域包视为 private by default ,所以我不需要担心它们偶尔会被发布或明确标记为私有。