我从here读到,如果他们通过npm-
安装你的项目,那么package.json文件中的依赖项允许人们安装依赖项。最后,dependencies字段用于列出所有依赖项 您的项目在npm上可用。当有人安装你的 通过npm项目,列出的所有依赖项将安装为 好。另外,如果有人在根目录中运行npm install 您的项目,它将安装所有依赖项 ./node_modules。
如果有人没有在项目的根目录中运行npm install,那么将安装所有依赖项?
另外,如果他们选择通过Github克隆这个项目呢?无论如何它都准备好了,对吗?那么在那时,除了向用户提供有关项目的元数据之外,package.json文件的目的是什么?
答案 0 :(得分:7)
如果某人没有在项目的根目录中运行npm install,那么将安装所有依赖项?
如果您的意思是'如果您在另一个目录中运行该命令将在何处安装,NPM将向上搜索父目录,直到找到package.json
,然后安装该文件旁边的node_modules
文件夹中的依赖项。 I.E.他们总是会在项目根目录中结束。
另外,如果他们选择通过Github克隆这个项目呢?无论如何它都准备好了,对吗?那么在那时,除了向用户提供有关项目的元数据之外,package.json文件的目的是什么?
事实并非如此!节点项目总是有一个.gitignore
文件明确地将node_modules
排除在提交版本控制之外,并希望您在下载源代码后运行npm install
。
将您的依赖项放在GitHub存储库中的原因很少 - 只要项目符合Semantic Versioning(绝大多数包都这样做),npm install
永远不会导致要下载不兼容的版本,如果您绝对需要锁定依赖项的版本,则可以使用npm shrinkwrap
。
编辑:正如Matt的评论非常有用地指出的那样,NPM的几个功能超越了简单的元数据 - 我可能最常用的一个是Scripts,允许您为命令行操作创建项目特定的别名。
这对我来说派上用场的一个例子就是运行Webpack开发服务器 - 它已在我devDependencies
的项目中本地安装(你可以使用--save-dev
安装包时的选项),所以如果我是手动操作,我必须输入以下内容:
"./node_modules/.bin/webpack-dev-server" --inline --hot
坦率地说,这会有点痛苦。相反,我可以将它添加到我的package.json中(请注意,在使用NPM脚本时,node_modules/.bin
会自动添加到系统路径中,因此您不需要每次都输入该内容):
"scripts": {
"dev": "webpack-dev-server --inline --hot"
}
然后我必须运行的是:
npm run dev
除了这个简单的用例之外,还有几个特殊的用例。在某些事件上自动调用的脚本名称 - 例如,在将包发布到注册表之前运行prepublish
。