CLI 应用程序
CLI 应用程序需要在Windows
和Unix-like
两种系统上运行, 通常是包装两个命令行脚本(cmd脚本和shell脚本, ps1不讨论)添加到系统路径中.
第一步, 在package.json中设置bin字段
{
"name": "FileBrowser",
"version": "1.0.0",
"description": "A Online File Browser",
"bin": {
"fs": "./index.js"
},
"scripts": {
"start:dev": "nodemon index.js"
},
"license": "MIT",
"dependencies": {
"express": "^4.17.1"
}
}
使用yarn链接
[sudo] yarn link
[sudo] yarn unlink
-
win
如果package是CLI程序, 那么会在目录C:UsersAdministratorAppDataLocalYarnin
下生成对应的脚本文件.
并且C:UsersAdministratorAppDataLocalYarnDatalink
下会建立目录硬链接(幸运的是Windows可以跨驱动器建立硬链接, 而Linux下的目录只需建立符号链接就可以了, 目录的open操作在系统API层屏蔽了符号链接与硬链接的区别, 需要特意去读取符号链接文件本身属性时有别的open操作API) -
linux
root@ubuntu:~/git/FileBrowser# ls -lih /usr/local/bin/fs
674070 lrwxrwxrwx 1 root root 48 10月 18 02:17 /usr/local/bin/fs -> ../share/.config/yarn/link/file-browser/index.js
显然项目被链接到了/usr/local/share/.config/yarn/link
目录, 并且index.js被链接到PATH路径目录/usr/local/bin
下.
使用npm链接或安装
[sudo] npm link [.]
[sudo] npm unlink [.]
或者
[sudo] npm install --global [.]
[sudo] npm uninstall --global [.]
- win
win下不是建立可执行文件链接, 而是需要包装一个cmd命令, 使用node执行index.js文件.
C:UsersAdministratorAppDataRoaming
pmfs -> C:UsersAdministratorAppDataRoaming
pm
ode_modulesfile-browserindex.js
C:UsersAdministratorAppDataRoaming
pm
ode_modulesfile-browser -> E:cygwin64homeAdministratorgitFileBrowser
- linux
和yarn一样, 命令链接到/usr/local/bin
下, 不过项目链接到了/usr/local/lib/node_modules
:
/usr/local/bin/fs -> /usr/local/lib/node_modules/file-browser/index.js
/usr/local/lib/node_modules/file-browser -> /root/git/FileBrowser
设置process.title
以命名cmd窗口
使用npm运行每个Node.js项目的时候, cmd窗口都会变成"npm"几个字, 非常烦, 就连这种方式启动的cmd窗口也不行:
start "标题" cmd /c "npm run start:dev"
其实只需要设置process.title
就可以了:
index.js
#!/usr/bin/env node
process.title = '文件服务器';
最佳实践
- bin/[command].js
bin/[command].js
具有固定形式,因此不能是webpack等编译而来,因此,与dist区分开,通过require执行dist脚本:
#!/usr/bin/env node
require('../dist/index.js');