相比于普通的包只需要在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来测试没空格的场景。
