Heroku:命令未找到。

3
这似乎在之前已经在如何在Ubuntu上使用gems?以及其他答案中解决过,但这些解决方案似乎都不适用于我。

我正在使用Mac OSX 10.6

我已经使用bundler安装了heroku。以下是我的gem环境和路径 - 我尝试将EXECUTABLE DIRECTORY和GEM PATHS中列出的文件夹添加到我的$PATH中,但每当我在我的rails项目中输入heroku时,我总是得到“command not found”的错误提示。

$ bundle show heroku
/Library/Ruby/Gems/1.8/gems/heroku-1.18.3

$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.6.1
  - RUBY VERSION: 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
  - INSTALLATION DIRECTORY: /Library/Ruby/Gems/1.8
  - RUBY EXECUTABLE: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - universal-darwin-10
  - GEM PATHS:
     - /Library/Ruby/Gems/1.8
     - /Users/iantinsley/.gem/ruby/1.8
     - /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://rubygems.org/

$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/iantinsley/bin:/usr/local/bin:/usr/bin

$ heroku
-bash: heroku: command not found

任何帮助都非常感激。

你能将出错的命令及其输出复制粘贴一下吗? :) - sarnold
bundle exec heroku 能用吗? - matt
是的,bundle exec 可以正常工作,我可以接受。但是从 /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin 运行 heroku 失败了,因为依赖项没有被加载。我在一个“答案”中详细说明了这一点,但有人将其删除了 - 不确定为什么。 - Ian
@user656510,感谢您更新帖子,非常好。可惜您的附言被删除了。如果您可以编辑帖子并包含堆栈跟踪,则会很有用。 :) 我猜您需要向“RUBYLIB”环境变量添加一些目录(有关详细信息,请参见“ruby(1)”手册),以便Ruby可以找到所需的软件包,但是如果没有看到具体的错误消息,就很难知道我是否正确了解情况。 - sarnold
4个回答

3
默认情况下,Mac上的RubyGems会将可执行文件安装到/usr/bin而不是/Library/Ruby/Gems目录下。然而,这两个目录具有不同的权限:
~ $ ls -ld /usr/bin/ /Library/Ruby/Gems/
drwxrwxr-x     4 root  admin    136 15 Nov 22:19 /Library/Ruby/Gems/
drwxr-xr-x  1085 root  wheel  36890 11 Feb 22:57 /usr/bin/

因此,尽管它们都由root拥有,但是gems目录可被admin组中的任何人写入,而/usr/bin则不行。
这里似乎发生了一个问题,当bundler安装gem时,可能由于权限问题,未能将heroku可执行文件安装到/usr/bin。这篇博客文章暗示了这是OSX上早期版本bundler的一个问题。
rubygems安装的可执行文件并不仅仅是从gem的bin目录(即/Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin)复制的heroku脚本。相反,它是由rubygems生成的包装器脚本,首先加载rubygems以使其在ruby加载路径上发挥其魔力,因此当调用脚本本身时,任何require语句都能够找到适当的库。
这意味着,如果直接调用脚本,则不会加载rubygems,因此加载路径不会正确设置,正如您所看到的,会出现有关缺少依赖项的错误。为了证明这一点,请尝试运行
$ ruby -rubygems /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin/heroku

该命令运行脚本,但首先加载rubygems。这应该(可能 - 我不确定)有效。

这也是为什么bundle exec heroku有效的原因。 Bundler会根据需要设置load path。此外,这样做确保了load path设置与您的Gemfile.lock文件匹配-这确实是bundler的目的。

我不建议向$PATH中添加任何内容。正如我们所看到的那样,它行不通,而且每次升级heroku gem时都需要更改它。

我也建议不要向$RUBYLIB变量中添加任何内容。这样做可能实际上可以使heroku命令工作,但使用rubygems和bundler的整个重点在于它们为您管理这样的东西。

我的第一个建议是使用rvm。 这是一个非常有用的工具,我认为值得花些时间研究一下。

如果您不能或不愿这样做,则可能需要重新安装heroku gem,并确保正确安装。首先使用以下命令删除现有的gem:

$ sudo gem uninstall heroku

然后确保您拥有最新版本的bundler:


$ sudo gem update bundler

最后使用以下命令重新安装:
$ bundle install

它应该要求您输入密码,以便将可执行文件安装到正确的位置。请注意,不要在此处使用sudo - 有关详细信息,请参见上面的链接。


非常全面和精彩的回答。你是正确的,对我来说运行ruby -rubygems /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin/heroku是有效的。我学到了很多东西。我熟悉RVM并在工作中使用它,但认为只有一个环境,我会不用它。下次我会使用它。目前我要么重新安装要么通过bundle exec运行它(我没有运行_那么多_ heroku命令,所以目前不是问题)。 - Ian

1

尝试将此添加到您的PATH末尾:

/Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin

如果这不起作用,那么请让 Spotlight 查找名为“heroku”的文件,并将相应的目录添加到您的PATH中。如果您有时间并想要成为一个老派的 Unix 人士:
$ cd /
$ ls -l $(find [A-Z]* -name heroku -not -type d -print)

你也可以使用Cinderella来设置你的Ruby/PostgreSQL/MySQL/MongoDB/...环境。这将为您提供最新版本的所有内容,并合理地设置您的路径。我在启动Cinderella时遇到了一些问题,但它已经成为我的救星,非常好的是它把所有东西都放在~/Developer/而不是到处散落。


我将 /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin 添加到了我的路径中。这使得我可以运行 heroku,但我得到了以下的堆栈跟踪。 - Ian
@suser656510:sarnold关于“RUBYLIB”的评论是正确的。您应该可以编辑问题以添加堆栈跟踪,您的答案可能被删除,因为它是一个问题更新而不是答案。 - mu is too short

0

使用以下命令在sudo下卸载并重新安装它可以解决问题。我正在使用macOS 10.14。

curl https://cli-assets.heroku.com/install.sh | sh

我最初使用homebrew安装,但总是出现command not fund错误。原因可能是curl安装在官方文档中提到的两个目录中进行设置。

要快速设置为/usr/local/lib/heroku和/usr/local/bin/heroku,请运行此脚本(脚本需要sudo且不兼容Windows)


0

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