在node_modules中,.bin文件夹的目的是什么?

65
今天,一位同事向我解释了如何创建Node.js项目,我发现在./node_modules中有一个名为.bin的隐藏文件夹。我必须说,在添加“bootcamp”和“bower”工具到该项目后,我才发现了这一点。.bin是用来做什么的?它是被创建出来干什么的?
2个回答

39

那是存放来自你的节点模块的二进制文件(可执行文件)的文件夹。

NPM网站的说明如下:

当处于全局模式时,可执行文件链接到Unix上的{prefix}/bin或直接链接到Windows上的{prefix}。

当处于本地模式时,可执行文件链接到./node_modules/.bin中,以便它们可以在通过npm运行的脚本中使用。(例如,当您运行npm test时,测试运行程序将在路径中。)


2
好的,谢谢。我不知道如何在Google中查找这种信息。有没有办法在Google中找到.bin文件的用途?实际上,我现在正在尝试找到config.rb文件,但是我什么也没找到。谢谢。 - Cremix_hellven
4
"node_modules中的bin文件夹"是我的第三个搜索结果,标题为"npm-folders"。 - alandarev

34

node_modules/.bin目录是存储项目所使用的模块二进制文件的地方,通常使用符号链接指向相应模块目录中的二进制文件。例如,我是通过这种方式查看npm包standard(JavaScript风格指南、linter和格式化程序)中的二进制文件standard

$ ls node_modules/.bin/standard -l
lrwxrwxrwx 1 jfolpf jfolpf 22 jul 17 08:29 standard -> ../standard/bin/cmd.js
当我运行命令node_modules/.bin/standard时,实际上我正在运行来自npm包standardnode_modules/standard/bin/cmd.js。这个符号链接是在安装该软件包时创建的,也就是说,在执行npm install standard命令时创建的。
这些二进制文件还允许您直接从npm脚本中使用模块。例如,您可能没有使用npm install standard -g全局安装standard,这意味着您无法在终端上直接运行standard到您的模块的主目录中。
但您可以通过将以下内容分别添加到您的package.json中,编写npm startnpm test脚本:
"scripts": {
  "start": "standard src/*.js",
  "test": "standard src/*.js && node myTest.js"
}

只要你的项目依赖有 standard,那么这完全是正确的。即使该模块不是全局模块,也无法被操作系统直接使用,npm 仍然可以查找给定名称为 standard 的模块的 bin 文件夹,并触发编译后的二进制文件。因此,确实是 npm 运行了这样的脚本:

"start": "node_modules/.bin/standard src/*.js",

5
值得一提的是,通过这种方式可以运行devDependencies中的任意二进制文件。可以使用npm run <script_name>来实现。这很重要,因为它允许您摆脱全局依赖项以启动/构建/测试项目,并且可以摆脱大型README,该README描述了需要安装哪个版本的哪个依赖项才能使所有内容正常工作。唯一剩下的全局依赖项是Node本身。而且这也可以通过某些Node版本管理器(如Volta)解决,可以将Node版本固定到您的“package.json”文件中。 - Ruslan Stelmachenko
2
非常感谢!这绝对应该是被接受的答案 :) - Chen Ni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接