2014-06-06 73 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