node_modules中.bin

172 阅读2分钟

package.json

先看看常见的一个package.json文件中script配置

"scripts": {
    "build": "yarn build-prod",
    "build-prod": "env-cmd -e production craco build",
    "build-test": "env-cmd -e test craco build",
    "build-uat": "env-cmd -e uat craco build",
    "build:analyze": "cross-env BUILD_ANALYZER=true yarn build-prod",
    "changelog": "standard-version -n",
    "commit": "git-cz",
    "start": "env-cmd -e development craco start",
    "test": "craco test"
},

  • 为什么运行npm run test的时候, craco 可以运行命令?

是因为在node_modules文件中有.bin目录,npm run会将.bin目录中的二进制文件(craco/bin)提供到脚本的PATH中.

/node_modules
    /.bin
        /craco
        /git-cz
        /env-cmd
        ...

node_modules/.bin

在项目中, 除了shell预先存在的PATH之外,npm run还将node_modules/.bin添加到提供给脚本的PATH中.

本地安装的依赖项提供的任何二进制文件都可以在没有node_modules/.bin前缀的情况下使用.

"scripts": {
    "test": "tap test/*.js"
}

而不是

"scripts": {
    "test": "node_modules/.bin/tap test/*.js"
}

你的脚本运行的实际shell取决于平台; 默认情况下, 类unix系统它是/bin/sh命令, 在windows它是cmd.exe

如何将三方的包添加到.bin中

许多三方的package都有可执行文件, 它们希望将这些文件添加到PATH中, npm使得这变得非常简单.

要使用它, 请在package.json文件中提供一个bin字段, 它是命令名称和本地文件名的映射. 全局安装此软件包时, 该文件将链接到全局bins目录中.

例子如下:

{ 
    "bin": { 
        "myapp": "./cli.js" 
     } 
}

当你安装myapp时,

  • 如果是类unix操作系统, 它将创建一个从cli.js脚本到/usr/local/bin/myapp的符号链接.
  • 如果是windows, 它将创建一个cmd文件, 通常位于C:\Users\{Username}\AppData\Roaming\npm\myapp.cmd 运行cli.js脚本

/node_modules/.bin/commitizen文件内容如下

#!/usr/bin/env node

require('./commitizen.js');

请确保你的bin文件中引用的文件以#!/usr/bin/env node开头, 否则脚本将在没有node可执行文件的情况启动

docs.npmjs.com/cli/v9/comm…