Javascript 节点全局安装错误

Javascript 节点全局安装错误,javascript,node.js,npm,Javascript,Node.js,Npm,我正在尝试制作一个节点模块,当与-g一起安装时,它将通过来自终端的单个命令运行 所有的教程都显示它非常简单,所以我不知道我遗漏了什么。以下是我所做的: Package.json: ... "bin": { "myapp": "./lib/myapp.js" }, ... 然后我尝试在全球范围内运行它: $ myapp 然后,我得到了一个全局错误,老实说,这看起来像是在读取我的应用程序(JS文件)时试图运行bash脚本。以下是输出: $ myapp .../io.js/v2.0.2/

我正在尝试制作一个节点模块,当与
-g
一起安装时,它将通过来自终端的单个命令运行

所有的教程都显示它非常简单,所以我不知道我遗漏了什么。以下是我所做的:

Package.json:

...
"bin": {
  "myapp": "./lib/myapp.js"
},
...



然后我尝试在全球范围内运行它:

$ myapp
然后,我得到了一个全局错误,老实说,这看起来像是在读取我的应用程序(JS文件)时试图运行bash脚本。以下是输出:

$ 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')
不确定我做错了什么,但我在网上找不到其他人有这个问题

看-看起来它并没有试图解释JS

对,“二进制”应该是一个shell脚本。您仍然可以用JS编写,只需告诉shell使用哪个解释器。例如,您可以添加

#!/usr/bin/env node

到文件顶部,它告诉shell使用
节点
来解释脚本的其余部分。

npm
为您标识的文件添加一个符号链接,使其显示在您的路径上。因此,在本例中,它实际上是试图像执行任何脚本一样执行文件。您需要添加一个#!行,以便shell知道如何执行它

例如:

#!/usr/bin/env node
/**
* Module dependencies
*/

var _ = require('lodash')

#行在Windows上尤其重要,因为npm会查找它并创建适当的
.bat
文件包装器,它知道如何在节点环境中运行脚本。

Aha!!这完全有道理!现在,我很好奇,如果您像
node./lib/myapp
那样运行JS文件,它不会破坏JS文件吗?不,它不会破坏-node知道忽略它it@knolleary:不知道。@dc2:无论哪种方式,您都可以创建一个只包含
节点路径/to/jsfile
的专用二进制文件。谢谢@FelixKling和knolleray。信息量很大。
#!/usr/bin/env node
#!/usr/bin/env node
/**
* Module dependencies
*/

var _ = require('lodash')