我试图创建一个Node模块,当与-g
一起安装时,它将由来自终端的单个命令运行。
所有教程都很简单,所以我不知道自己错过了什么。这就是我所做的:
的package.json:
...
"bin": {
"myapp": "./lib/myapp.js"
},
...
npm publish
npm install -g myapp
然后我尝试全局运行它:
$ myapp
然后我得到了一些错误,老实说看起来它正在尝试在阅读我的应用程序时运行bash脚本,这是一个JS文件。这是输出:
$ myapp
.../io.js/v2.0.2/bin/myapp: line 1: $'\r': command not found
.../io.js/v2.0.2/bin/myapp: line 2: /**
.../io.js/v2.0.2/bin/myapp: line 3: package.json: command not found
.../io.js/v2.0.2/bin/myapp: line 4: */
.../io.js/v2.0.2/bin/myapp: line 5: $'\r': command not found
.../io.js/v2.0.2/bin/myapp: line 6: `var _ = require('lodash')
$
看 - 它看起来好像不是在试图解释JS。这是我试图运行的JS文件的标题:
/**
* Module dependencies
*/
var _ = require('lodash')
不确定我做错了什么,但我找不到其他人在网上遇到此问题。
答案 0 :(得分:1)
请参阅 - 看起来它并没有试图解释JS。
对,"二进制"应该是一个shell脚本。你仍然可以用JS编写它,你只需告诉shell使用哪个解释器。例如。你可以添加
#!/usr/bin/env node
到文件的顶部,告诉shell使用node
来解释脚本的其余部分。
答案 1 :(得分:1)
npm
为您标识的文件添加符号链接,以便它显示在您的路径中。所以在这个例子中,它确实像任何脚本一样尝试执行文件。你需要添加一个#!行到文件,以便你的shell知道如何执行它。
例如:
#!/usr/bin/env node
/**
* Module dependencies
*/
var _ = require('lodash')
#!
行在Windows上尤为重要,因为npm会查找该行,并创建适当的.bat
文件包装器,知道如何在节点环境中运行脚本。