npm包中的二进制文件

时间:2014-06-06 13:16:53

标签: javascript node.js bash binary npm

我尝试创建一个npm包,它可以作为shell的命令启动。我有package.json

{
  "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在另一个目录中。如何从我的脚本中获取此目录名称?或者也许有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:10)

实际上,您可以将myapp.js文件放入bin 所以,package.json文件中的bin键应该是这样的:

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

myapp.js的第一行,您必须添加此shebang行:

#!/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

答案 1 :(得分:0)

https://docs.npmjs.com/files/package.json#bin

从上面的链接:

  

...

     

要使用此功能,请在package.json中提供一个 bin 字段,该字段是命令名到本地文件名的映射。在安装时,npm会将文件符号链接到 prefix / bin 进行全局安装,或 ./ node_modules / .bin / 进行本地安装。

     

例如,myapp可能具有以下内容:

     
{ "bin" : { "myapp" : "./cli.js" } }
     

因此,当您安装myapp时,它将创建从 cli.js 脚本到 / usr / local / bin / myapp 的符号链接。

     

...