2014-06-06 72 views
0

我嘗試創建一個npm包,它可以作爲shell的命令啓動。我有package.jsonnpm包中的二進制文件

{ 
    "name": "myapp", 
    "version": "0.0.6", 
    "dependencies": { 
    "async": "", 
    "watch": "", 
    "node-promise": "", 
    "rmdir": "", 
    "should": "", 
    "websocket": "" 
    }, 
    "bin": "myapp" 
} 

myapp

#!/bin/bash 

path=`dirname "$0"` 
file="/myapp.js" 

node $path$file $1 & 

但我得到一個錯誤:

module.js:340 
    throw err; 
     ^
Error: Cannot find module '/usr/local/bin/myapp.js' 
    at Function.Module._resolveFilename (module.js:338:15) 
    at Function.Module._load (module.js:280:25) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:902:3 

的問題是,myapp.js是另一個目錄。我如何從腳本中獲取這個目錄名稱?或者也許有更好的方法來做到這一點?

+0

爲什麼不要給cmdline上的myapp.js'目錄路徑'調用腳本作爲'./scriptname.sh'directory_path''然後而不是'node $ path $ file $ 1&'use'node $ 1/$ {file}' ,如果你這樣做,你不需要'path = \'dirname「$ 0」\'' – PradyJord

+0

因爲這個文件是一個包的一部分。我希望這個腳本是一個簡單的全局命令。 – ciembor

+0

您需要將'$ 0'符號鏈接路徑解析爲實際的文件路徑。你看過http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself? – loganfsmyth

回答

8

實際上,您可以將myapp.js文件放入bin
所以,在文件的package.json的bin關鍵應該是這樣的:

"bin": { "myapp" : "<relative_path_to_myapp.js>/lib/myapp.js" } 

myapp.js第一線,你必須添加此家當行:

#!/usr/bin/env node 

它告訴系統使用node來運行myapp.js


...或者,如果你不想直接調用myapp.js做,你可以創建一個這樣的腳本是可執行文件:

#!/usr/bin/env node 

var myapp = require('<relative_path_to_myapp.js>/myapp.js'); 
myapp.doSth(); 

和的package.json:

"bin" : { "myapp" : "<relative_path_to_the_script>/script.js" } 

通過這樣做,您可以避免找到nodemodule的路徑。


但是......如果你堅持使用舊的myapp bash腳本,那麼你就可以找到這個模塊路徑:

myapp_path=$(npm explore -g myapp -- "pwd") 

希望這些幫助:d

+0

非常感謝,這非常有幫助! – ciembor