搜尋

首頁  >  問答  >  主體

node.js - local 方式 npm install 在子目录中重复安装 express

各位兄台,最近刚学 node.js 使用 npm install local 方式安装 遇到软件包重复安装问题:

目录结构:

  1. nodejs 主目录~/code/nodejs/
  2. nodejs 子项目~/code/nodejs/test

主目录 安装 express

gentoo ~/code/nodejs $ npm install express --save
express@4.12.3 node_modules/express
├── merge-descriptors@1.0.0
├── utils-merge@1.0.0
├── cookie-signature@1.0.6
├── methods@1.1.1
├── cookie@0.1.2
├── fresh@0.2.4
├── escape-html@1.0.1
├── range-parser@1.0.2
├── content-type@1.0.1
├── finalhandler@0.3.4
├── vary@1.0.0
├── parseurl@1.3.0
├── serve-static@1.9.2
├── content-disposition@0.5.0
├── path-to-regexp@0.1.3
├── depd@1.0.0
├── qs@2.4.1
├── on-finished@2.2.0 (ee-first@1.1.0)
├── debug@2.1.3 (ms@0.7.0)
├── etag@1.5.1 (crc@3.2.1)
├── send@0.12.2 (destroy@1.0.3, ms@0.7.0, mime@1.3.4)
├── type-is@1.6.1 (media-typer@0.3.0, mime-types@2.0.10)
├── accepts@1.2.5 (negotiator@0.5.1, mime-types@2.0.10)
└── proxy-addr@1.0.7 (forwarded@0.1.0, ipaddr.js@0.1.9)

子目录 安装 express-generator

测试 express-generator子目录~/code/nodejs/test

gentoo ~/code/nodejs $ mkdir test && cd test

gentoo ~/code/nodejs/test $ npm install express-generator --save
npm WARN prefer global express-generator@4.12.1 should be installed with -g
express-generator@4.12.1 ../node_modules/express-generator
├── sorted-object@1.0.0
├── commander@2.6.0
└── mkdirp@0.5.0 (minimist@0.0.8)

express-generator 是安装在 nodejs 开发 主目录 下的 ~/code/nodejs/node_modules 目录:

gentoo /home/i/code/nodejs 
$ tree -L 2 ~/code/nodejs/node_modules/
/home/i/code/nodejs/node_modules/
├── express
│   ├── History.md
│   ├── index.js
│   ├── lib
│   ├── LICENSE
│   ├── node_modules
│   ├── package.json
│   └── Readme.md
└── express-generator
    ├── bin
    ├── LICENSE
    ├── node_modules
    ├── package.json
    ├── README.md
    └── templates

但发现在 主目录子目录 下的 node_modules 都有安装 express

主目录 的 express 目录树:

主目录 下的 express 目录树,比 子目录 多安装了 debug 包:

gentoo /home/i/code/nodejs
$ tree -L 2 node_modules/express
node_modules/express
├── History.md
├── index.js
├── lib
│   ├── application.js
│   ├── express.js
│   ├── middleware
│   ├── request.js
│   ├── response.js
│   ├── router
│   ├── utils.js
│   └── view.js
├── LICENSE
├── node_modules
│   ├── accepts
│   ├── content-disposition
│   ├── content-type
│   ├── cookie
│   ├── cookie-signature
│   ├── debug                   <--
│   ├── depd
│   ├── escape-html
│   ├── etag
│   ├── finalhandler
│   ├── fresh
│   ├── merge-descriptors
│   ├── methods
│   ├── on-finished
│   ├── parseurl
│   ├── path-to-regexp
│   ├── proxy-addr
│   ├── qs
│   ├── range-parser
│   ├── send
│   ├── serve-static
│   ├── type-is
│   ├── utils-merge
│   └── vary
├── package.json
└── Readme.md

28 directories, 11 files

子目录 的 express 目录树:

gentoo /home/i/code/nodejs/test
$ tree -L 2 node_modules/express/
node_modules/express/
├── History.md
├── index.js
├── lib
│   ├── application.js
│   ├── express.js
│   ├── middleware
│   ├── request.js
│   ├── response.js
│   ├── router
│   ├── utils.js
│   └── view.js
├── LICENSE
├── node_modules
│   ├── accepts
│   ├── content-disposition
│   ├── content-type
│   ├── cookie
│   ├── cookie-signature
│   ├── depd
│   ├── escape-html
│   ├── etag
│   ├── finalhandler
│   ├── fresh
│   ├── merge-descriptors
│   ├── methods
│   ├── on-finished
│   ├── parseurl
│   ├── path-to-regexp
│   ├── proxy-addr
│   ├── qs
│   ├── range-parser
│   ├── send
│   ├── serve-static
│   ├── type-is
│   ├── utils-merge
│   └── vary
├── package.json
└── Readme.md

27 directories, 11 files

WHY

为什么 子目录 不能复用 主目录 的 express 还要 重复安装 呢?

伊谢尔伦伊谢尔伦2786 天前547

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-04-17 11:39:53

    兩個問題
    1,關於express-generator,他是yeoman的一個express項目生成器,正如錯誤提醒裡那樣npm WARN prefer global express-generator@4.12.1 should be installed with -g,要想使用它,除了要
    npm install -g yo grunt-cli bower全局安裝yeoman三件套以外,所有的生成器(以generator結尾的套件),也必須全域安裝npm install -g express-generator,然後在你想要創建express專案的目下執行yo express才能創建一個機遇生成器的種子專案。你所看到的兩個express包,一個是express本生的,還有一個是生成器的
    2,關於nodejs的包為什麼不能重複使用。
    nodejs的模組化使用commonjs規範,require時,預設在目前目錄下的node_modules下尋找模組,沒有的話向父目錄下的node_modules尋找,直至根目錄,不存在你安裝在node目錄下,所有專案都能用了。這裡需要指出的是-g的全域安裝,也不是全域可用,他只是生成了一個放在path下的可執行程式罷了,如npm install -g bower,然後你就可以在命令列裡調用bower程式了,如任以目錄下bower install jquery
    多看點基礎的東西,好好了解下node的模組機制,希望我的回答對你有幫助

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 11:39:53

    我還是覺得maven的版本管理比npm

    回覆
    0
  • 取消回覆