创建一个npm install之后可以直接执行的包
本文由 小茗同学 发表于 2019-01-30 浏览(4363)
最后修改 2019-01-30 标签:node

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