npm安装如何工作
我使用Node.js(通过browserify )为我的每个Web应用程序,所有这些都有一些共同的依赖和其他特定于自己。 这些应用程序中的每一个都有一个package.json
文件,用于指定所需模块的版本。
现在,我的应用程序的父文件夹中有一个/node_modules
目录,它们都需要引用,然后我将特定于应用程序的模块放在该应用程序目录的一个node_modules
文件夹中。 这在短期内工作正常,因为我的require()
语句能够在文件结构中继续向上查找,直到find具有正确应用程序的node_modules
目录为止。
当这个问题变得棘手的时候,我想回到一个旧的项目并运行npm install
,以确保它仍然可以find所需的所有依赖项。 (谁知道自父主目录层次以来发生了什么有趣的事情)。我的印象是npm install
做到了这一点:
- 对于
package.json
列出的每个模块,首先检查它是否存在, 按照相同的方式向上移动目录 。 如果不是,则将其安装到本地node_modules
目录(如有必要,创build该目录)。
但是,当我在应用程序文件夹中运行npm install
时,它似乎在本地安装所有内容,而不pipe上游可能存在哪些内容。 这是正确的行为? (这可能还有另一个原因,比如我的package.json
糟糕的版本语言)。 如果这是正确的行为,有没有办法让我的npm install
行为像上面一样?
在每个应用程序中广泛地复制模块并不是什么大不了的事情,但是感觉混乱,并且使我无法对通用模块进行小的改进,也不必更新每个旧的package.json
文件。 当然,这可能是一件好事…
但是,当我在应用程序文件夹中运行npm install时,它似乎在本地安装所有内容,而不pipe上游可能存在哪些内容。 这是正确的行为? (这可能还有另一个原因,比如我的package.json中的糟糕的版本语言)。 如果这是正确的行为,有没有办法让我的npm安装行为像上面一样?
是的,那是npm install所做的。 在node.js代码中, require
algorithm具有特定的顺序,包括遍历文件系统。 但是, npm install
不这样做。 它只是安装到位。 它使用的algorithm都被限制在当前目录下的一个node_modules
目录下,并且不会触及任何高于(除-g
之外的)任何东西。
在每个应用程序中广泛地复制模块并不是什么大不了的事情,但是感觉混乱,并且使我无法对通用模块进行小的改进,也不必更新每个旧的package.json文件。 当然,这可能是一件好事…
是的,基本上你做错了。 常规的工作stream程适合互联网。 对于您的用例,它会创build一些额外的繁琐工作,但也可以按照预期使用语义版本化,并在您的package.json中为您的应用程序指定"mylib": "^1.0.0"
,然后自动获取更新的版本当你npm install
。