2015-06-10 121 views
0

我正在試圖製作一個節點模塊,它與-g一起安裝時,將通過終端的單個命令運行。節點全局安裝錯誤

所有的教程都顯示它非常簡單,所以我不知道我錯過了什麼。下面是我做了什麼:

的package.json:

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

npm publish 

npm install -g myapp 

然後我試圖在全球範圍內運行:

$ myapp 

然後我得到一個錯誤glob,它看起來像是試圖在閱讀我的應用程序時運行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') 

不知道我做錯了,但我無法找到任何人在網上有這個問題。

回答

1

看 - 它看起來像它不試圖解釋JS。

對,「二進制」應該是一個shell腳本。你仍然可以用JS寫它,你只需告訴shell使用哪個解釋器。例如。您可以添加

#!/usr/bin/env node 

到文件的頂部,它告訴使用node解釋腳本的其餘部分的外殼。

+0

啊哈!這使得總體感覺!現在,只是好奇,如果你像'node。/ lib/myapp'那樣運行JS文件,那不會破壞JS文件嗎? – dthree

+0

不,它不會中斷 - 節點知道忽略它 – knolleary

+0

@knolleary:不知道。 –

1

npm爲您識別的文件添加一個符號鏈接,以便它出現在您的路徑中。因此,在這種情況下,它就像嘗試任何腳本一樣,試圖執行該文件。你需要添加一個#!行到文件,所以你的shell知道如何執行它。

例如:

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

var _ = require('lodash') 

#!線是在Windows上尤爲重要,因爲NPM會查找並創建一個知道如何在節點環境中運行腳本適當.bat文件包。