相比于普通的包只需要在2个地方特殊处理一下:
第一
package.json
里面加上bin
配置,以下示例中,run-server
是安装之后生成的命令,index.js
是你的代码入口。
{
"bin": {
"run-server": "./index.js"
}
}
第二
index.js
第一行需要加如下代码(特别注意,!
和/usr
之间没有空格!!!具体原因您可以看本文最后一小节):
#!/usr/bin/env node
它的作用是指定脚本的解释程序为node,类似的还有:
#!/usr/bin/env python
#!/usr/bin/env perl
#!/usr/bin/env zimbu
#!/usr/bin/env ruby
我们知道/usr/bin/
是一个系统目录,那么env
是什么呢?env
其实是一个环境变量,内置了各种bin目录的路径,包括PATH
(可以直接在终端输入env
查看其内容)。
最后
按照上述2步改完之后,你的npm包在npm install -g xxx
之后就会自动创建一个run-server
的命令,可以直接执行。可以参考:https://github.com/sxei/run-server 的写法
Mac下生成的命令:
Windows下生成的命令:
补充重点
注意!注意!#!/usr/bin/env node
中,!
和/usr
之间千万不能有空格(也就是不能写成#! /usr/bin/env node
),如果加了空格:
Mac
下没有任何问题,可以正常执行;Windows
下无法执行,因为它生成的cmd文件有问题。
有空格(#! /usr/bin/env node
)时生成的run-server.cmd
内容如下,执行后会直接把index.js
以文本文件的方式打开:
@"%~dp0\node_modules\run-server\index.js" %*
没空格(#!/usr/bin/env node
)时生成的run-server.cmd
内容如下,命令可以正常执行:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\run-server\index.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\run-server\index.js" %*
)
您可以通过执行npm i run-server@1.0.2 -g
来测试有空格的场景,执行npm i run-server@1.0.3 -g
来测试没空格的场景。