【问题标题】:Binary file in npm packagenpm 包中的二进制文件
【发布时间】:2014-07-27 18:45:39
【问题描述】:

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

【问题讨论】:

  • 你为什么不在 cmdline 上给 myapp.js directory path 调用脚本为 ./scriptname.sh 'directory_path' 然后而不是 node $path$file $1 & 使用 node $1/${file},如果你这样做你就不需要 path=`dirname "$0"`
  • 因为这个文件是包的一部分。我希望这个脚本是一个简单的全局命令。
  • 您需要将 $0 符号链接路径解析为实际文件路径。你看过stackoverflow.com/questions/4774054/…吗?
  • 是的,我知道,但是我不知道myapp.js在哪里,它是随包安装的,应该在不同的目录中。问题是如何找到该文件的路径。

标签: javascript node.js bash binary npm


【解决方案1】:

其实你可以把你的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" }

无论哪种方式,您都可以避免找到节点模块的路径。


但是...如果您坚持使用旧的 myapp bash 脚本,那么您可以使用以下命令找到模块的路径:

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

希望这些帮助:D

【讨论】:

  • 非常感谢,这很有帮助!
【解决方案2】:

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 的符号链接。

...

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2017-06-13
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多