【发布时间】:2014-10-07 23:51:05
【问题描述】:
今天一位同事向我解释了如何创建 nodejs 项目,我注意到在 ./node_modules 中有一个名为 .bin 的不可见文件夹。我必须说,我在添加到项目“bootcamp”和“bower”工具后发现了这一点。 .bin 的目的是什么?它是为了什么而创建的?
【问题讨论】:
今天一位同事向我解释了如何创建 nodejs 项目,我注意到在 ./node_modules 中有一个名为 .bin 的不可见文件夹。我必须说,我在添加到项目“bootcamp”和“bower”工具后发现了这一点。 .bin 的目的是什么?它是为了什么而创建的?
【问题讨论】:
目录node_modules/.bin 是存储项目使用的模块的二进制文件的地方,通常使用指向相应模块目录中相应二进制文件的符号链接。例如,这就是我从 npm 包标准(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 包standard 运行node_modules/standard/bin/cmd.js。这个符号链接是在安装包时创建的,即npm install standard
这些二进制文件还允许您直接从 npm 脚本中使用模块。例如,您可能没有在全局范围内安装 standard 和 npm install standard -g,这意味着您无法直接从终端上的模块主目录运行 standard。
但是您可以编写一个npm start 或npm test 脚本,分别将以下内容添加到您的package.json:
"scripts": {
"start": "standard src/*.js",
"test": "standard src/*.js && node myTest.js"
}
这是完全正确的,因为您有标准作为项目依赖项。即使该模块不是全局的并且不能被操作系统直接使用,npm 也可以为给定的standard 模块名称查找 bin 文件夹并触发编译的二进制文件。确实,npm 运行这样一个脚本:
"start": "node_modules/.bin/standard src/*.js",
【讨论】:
devDependencies 中的任意二进制文件都可以以这种方式运行。 npm run <script_name> 可以用于此。这很重要,因为允许您摆脱全局依赖项来启动/构建/测试您的项目,并摆脱描述您需要安装哪个版本的依赖项才能使所有这些工作正常的大 README。唯一剩下的全局依赖是 Node 本身。这也可以通过一些节点版本管理器(例如 Volta)来解决,它可以将节点版本固定到您的 package.json。
这是您的节点模块中的二进制文件(可执行文件)所在的文件夹。
可执行文件 在全局模式下,可执行文件链接到 {prefix}/bin 在 Unix 上,或直接进入 {prefix} 在 Windows 上。
在本地模式下,可执行文件被链接到 ./node_modules/.bin 所以 它们可以用于通过 npm 运行的脚本。 (为了 例如,当您运行 npm 时,测试运行程序将在路径中 测试。)
【讨论】: