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可执行文件的情况启动