节点全局安装错误

时间:2015-06-10 18:12:48

标签: javascript node.js npm

我试图创建一个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')

不确定我做错了什么,但我找不到其他人在网上遇到此问题。

2 个答案:

答案 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文件包装器,知道如何在节点环境中运行脚本。