V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lvii
V2EX  ›  Node.js

local 方式 npm install 在子目录中「重复」安装 express

  •  
  •   lvii · 2015-04-08 19:39:21 +08:00 · 4446 次点击
    这是一个创建于 3518 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ——

    目录结构:

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

    主目录 安装 express

    子目录 安装 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 [email protected] should be installed with -g
    [email protected] ../node_modules/express-generator
    ├── [email protected]
    ├── [email protected]
    └── [email protected] ([email protected])
    

    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 还要重复安装呢?

    ——

    6 条回复    2015-04-15 13:24:18 +08:00
    qiu8310
        1
    qiu8310  
       2015-04-08 20:31:10 +08:00
    目录树太多了,看的不是很明白,但我最近遇到类似问题:

    如果模块 a 依赖于 b,c; 而模块 b 也依赖于 c;
    当我在安装模块 b 的时候,c 模块就只会安装 1 次,并且是在 a 模块下。

    看你好像是分两次安装,第二次安装的时候估计不会检查你当前目录的父目录是否已经安装了你要依赖的模块吧。

    不知道这样理解对不对。
    zhaoace
        2
    zhaoace  
       2015-04-09 13:49:19 +08:00
    唔,这个树展开的话每个都是当前根节点的所有依赖。
    为神马不能复用呢? 因为版本不一定一样啊。。。

    每个项目的依赖内容都完整搞下来,这样文件夹会大一点,但是项目的path清晰了,里面的依赖版本独立了,整个项目的可移植性也变强了。

    想象一下你把某个项目做完,整个项目folder撸走,换个地方还能run是不是有点小激动呢?
    lvii
        3
    lvii  
    OP
       2015-04-09 16:22:43 +08:00
    @qiu8310 兄。
    1. 我先在 父目录 安装 express
    2. 然后在 子目录 安装 express-generator 。express-generator 以来 express
    3. 安装 express-generator 时,没有检查,父目录已经安装过 express 又在 子目录 下 重复 安装了一遍 express

    @zhaoace 兄。你的意思,这是正常现象。npm 使用 local 方式安装,不会检查 local 路径下已经有安装过的 package 即使版本满足依赖。。。。
    zhaoace
        4
    zhaoace  
       2015-04-10 08:40:27 +08:00
    你应该这么理解这个问题。
    无论是你的父目录还是子目录还是express还是express-generator都是独立的项目,而每个项目的自己的依赖都在自己的目录里,不会往上回溯的。

    所以如果子目录里面用了express-generator,而express-generator自己有任何依赖的内容的话,要不然是从express-generator的目录下面查找,要不然就是去global path里面查找了,不会特地查看项目上游的path里面有没有相关内容的。

    甚至说express-generator依赖了某个npm,他都不会关心你的子项目里有没有,只关心express-generator的目录下面以及global下面有没有。

    :D
    zhaoace
        5
    zhaoace  
       2015-04-10 08:45:37 +08:00
    再多嘴说一句吧,你的依赖打开的太浅了。 你仔细去看下依赖的依赖就看明白了。。。

    悲伤的故事。。。
    lvii
        6
    lvii  
    OP
       2015-04-15 13:24:18 +08:00
    @zhaoace 这样。。。原来是依赖查找路径的杯桑故事。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:16 · PVG 14:16 · LAX 22:16 · JFK 01:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.