如何为 Hubot 设置 node_path

3
我正在使用hubot(具体来说是hubot-hipchat),想要使用https://github.com/scriby/asyncblock节点模块。在hubot中导入/要求节点模块的正确方法是什么?
我切换到安装hubot的位置(~/hubot)并执行以下操作:
编辑hubot/packages.json,将hubot-hipchat、asyncblock添加到依赖项部分。
  "dependencies": {
    "hubot-hipchat": ">= 1.0.4",
    "hubot": "2.1.4",
    "hubot-scripts": ">=2.0.4",
    "optparse": "1.0.3",
    "asyncblock": "2.0.8"
  }

我在我的scripts/test.coffee脚本中执行以下操作:

asyncblock = require('asyncblock')

当我启动hubot时,出现错误:ERROR Error: Cannot find module 'asyncblock'。
~/hubot/node_modules/asyncblock 存在。然后我尝试执行以下操作:
require.paths.push('/home/ubuntu/hubot/node_modules')

现在我不再遇到“找不到”的错误,但出现了一个新的错误:
ERROR Error: require.paths is removed. Use node_modules folders, or the NODE_PATH environment variable instead.

我在做什么不对吗?
我只是尝试在运行hubot的Ubuntu服务器上执行系统命令:
  asyncblock((flow) ->
    exec('node -v', flow.add())
    result = flow.wait()
    msg.send result
  )

编辑: 如果我将NODE_PATH环境变量设置为以下内容,它就能正常工作:
env NODE_PATH="/usr/lib/nodejs:/usr/share/javascript:/home/ubuntu/hubot/node_modules"

为什么按照惯例它不在hubot/node_modules中查找?

我可以回答你的问题的一部分:require.paths在Node 0.5中被移除了。任何使用require.paths.push的文章或源代码都已经过时了。我猜你正在使用Node 0.6.x? - Trevor Burnham
节点版本:v0.6.17。是的,我知道它已经被弃用/删除了。让我困惑的是为什么它在./node_modules中找不到模块 - 因为它可以很好地找到该目录中的其他模块(如hubot-hipchat)。 - rynop
3个回答

0
你的脚本中有 require('asyncblock') 吗?它是否在 ~/hubot 的子目录中?如果不是,那么它的 require 函数将不会查找 ~/hubot/node_modules
从该脚本中检查 module.paths 的值,以查看该脚本的 require 查找的所有非全局路径。

我的CoffeeScript文件在/hubot/scripts中。该脚本还使用了来自hubot-hipchat(位于/hubot/node_modules中)的方法。不确定为什么它找不到~/hubot/node_modules/asyncblock。 - rynop
这里是否涉及任何符号链接?也就是说,~/hubot/scripts 是一个真实的目录,~/hubot/scripts/test.coffee 是一个真实的文件吗?请再次报告 test.coffeemodule.paths 的值。 - Trevor Burnham
/hubot/scripts是一个真实的目录。/hubot/scripts/deploy.coffee(我的脚本)是deploy.coffee -> /home/ubuntu/git/mln-admin/hubot/scripts/deploy.coffee的符号链接。然而,在这个脚本中,如上所述,我使用了~/hubot/node_modules/hubot-hipchat/中的对象。module.paths是(有些不存在):/home/ubuntu/git/mln-admin/hubot/scripts/node_modules,/home/ubuntu/git/mln-admin/hubot/node_modules,/home/ubuntu/git/mln-admin/node_modules,/home/ubuntu/git/node_modules,/home/ubuntu/node_modules,/home/node_modules,/node_modules - rynop
所以等等,为什么/home/ubuntu/hubot/node_modules是你添加到NODE_PATH中使其工作的路径,但/home/ubuntu/git/mln-admin/hubot/node_modules是在module.paths中的路径?/home/ubuntu/git/mln-admin/hubot/node_modules是否包含一个名为asyncblock的子目录,其中包含一个package.jsonlib/asyncblock.js文件? - Trevor Burnham
因为/home/ubuntu/hubot/node_modules是hubot、hubot-hipchat和asyncblock的安装位置。上述问题和注释中的~表示'/home/ubuntu'。/home/ubuntu/hubot/scripts/deploy.coffee是我的脚本。是的,/home/ubuntu/git/mln-admin/hubot/node_modules/lib/asyncblock.js存在,并且可以在设置NODE_PATH环境变量时使用。 - rynop

0
这里的问题是您正在引用未添加到项目中的npm模块。从您的hubot文件夹的根目录运行以下代码:
npm install --save asyncblock

这将在 package.json 文件中将 asyncblock 保存为依赖项。 因此,如果您部署到 Heroku、OpenShift 或任何其他云服务,该服务将自动下载模块,以便您的机器人可以使用。

完成上述任务后

asyncblock= require 'asyncblock'

使用 CoffeeScript 是正确的


-1

这个很简单。我也在使用hubot和hipchat。你只需要做以下几步:

cd hubot-dir;
npm install asyncblock

这是你应该观察的内容:
$ npm install asyncblock
npm http GET https://registry.npmjs.org/asyncblock
npm http 200 https://registry.npmjs.org/asyncblock
npm http GET https://registry.npmjs.org/asyncblock/-/asyncblock-2.0.9.tgz
npm http 200 https://registry.npmjs.org/asyncblock/-/asyncblock-2.0.9.tgz
npm http GET https://registry.npmjs.org/fibers/0.6.7
npm http GET https://github.com/scriby/UglifyJS/tarball/1.2.5-6
npm http 200 https://registry.npmjs.org/fibers/0.6.7
npm http GET https://registry.npmjs.org/fibers/-/fibers-0.6.7.tgz
npm http 200 https://registry.npmjs.org/fibers/-/fibers-0.6.7.tgz
npm http 200 https://github.com/scriby/UglifyJS/tarball/1.2.5-6
npm http GET https://registry.npmjs.org/node-gyp
npm http 200 https://registry.npmjs.org/node-gyp
npm http GET https://registry.npmjs.org/node-gyp/-/node-gyp-0.4.5.tgz
npm http 200 https://registry.npmjs.org/node-gyp/-/node-gyp-0.4.5.tgz
npm http GET https://registry.npmjs.org/ansi
npm http GET https://registry.npmjs.org/glob
npm http GET https://registry.npmjs.org/graceful-fs
npm http GET https://registry.npmjs.org/fstream
npm http GET https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/rimraf
npm http GET https://registry.npmjs.org/mkdirp
npm http GET https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/semver
npm http GET https://registry.npmjs.org/tar
npm http GET https://registry.npmjs.org/which
npm http GET https://registry.npmjs.org/request
npm http 200 https://registry.npmjs.org/ansi
npm http GET https://registry.npmjs.org/ansi/-/ansi-0.0.4.tgz
npm http 200 https://registry.npmjs.org/graceful-fs
npm http GET https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.8.tgz
npm http 304 https://registry.npmjs.org/mkdirp
npm http 200 https://registry.npmjs.org/fstream
npm http GET https://registry.npmjs.org/fstream/-/fstream-0.1.18.tgz
npm http 200 https://registry.npmjs.org/rimraf
npm http GET https://registry.npmjs.org/rimraf/-/rimraf-2.0.2.tgz
npm http 304 https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/glob
npm http GET https://registry.npmjs.org/glob/-/glob-3.1.9.tgz
npm http 200 https://registry.npmjs.org/semver
npm http GET https://registry.npmjs.org/semver/-/semver-1.0.14.tgz
npm http 304 https://registry.npmjs.org/request
npm http 200 https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/minimatch/-/minimatch-0.2.5.tgz
npm http 200 https://registry.npmjs.org/which
npm http 200 https://registry.npmjs.org/tar
npm http GET https://registry.npmjs.org/which/-/which-1.0.5.tgz
npm http GET https://registry.npmjs.org/tar/-/tar-0.1.13.tgz
npm http 200 https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.8.tgz
npm http 200 https://registry.npmjs.org/ansi/-/ansi-0.0.4.tgz
npm http 200 https://registry.npmjs.org/fstream/-/fstream-0.1.18.tgz
npm http 200 https://registry.npmjs.org/rimraf/-/rimraf-2.0.2.tgz
npm http 200 https://registry.npmjs.org/glob/-/glob-3.1.9.tgz
npm http 200 https://registry.npmjs.org/minimatch/-/minimatch-0.2.5.tgz
npm http 200 https://registry.npmjs.org/semver/-/semver-1.0.14.tgz
npm http 200 https://registry.npmjs.org/which/-/which-1.0.5.tgz
npm http 200 https://registry.npmjs.org/tar/-/tar-0.1.13.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/lru-cache
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/block-stream
npm http 304 https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz
npm http 200 https://registry.npmjs.org/inherits
npm http 200 https://registry.npmjs.org/inherits
npm http 200 https://registry.npmjs.org/lru-cache
npm http GET https://registry.npmjs.org/lru-cache/-/lru-cache-1.1.0.tgz
npm http 200 https://registry.npmjs.org/block-stream
npm http GET https://registry.npmjs.org/block-stream/-/block-stream-0.0.5.tgz
npm http 200 https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz
npm http 200 https://registry.npmjs.org/lru-cache/-/lru-cache-1.1.0.tgz
npm http 200 https://registry.npmjs.org/block-stream/-/block-stream-0.0.5.tgz

fibers@0.6.7 install /tmp/hubot/node_modules/asyncblock/node_modules/fibers
node ./build.js

`linux-ia32` exists; skipping build
asyncblock@2.0.9 ./node_modules/asyncblock
├── uglify-js_scriby@1.2.5-6
└── fibers@0.6.7 (node-gyp@0.4.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接