По умолчанию rubygems на Mac устанавливает исполняемые файлы в /usr/bin
, а не в каталог gem в /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 не смог установить исполняемый файл heroku в /usr/bin
, когда установил гем, возможно, из-за этой проблемы с разрешениями. В этом сообщении в блоге предполагается, что это проблема с более ранними версиями пакета для OSX.
Исполняемый файл, который устанавливает rubygems, это , а не , просто копия сценария heroku из каталога bin гема (т.е. /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin
). Вместо этого это скрипт-обертка, сгенерированный rubygems, который сначала загружает rubygems, чтобы он мог использовать свое волшебство на пути загрузки ruby, чтобы при вызове самого сценария любые операторы require
могли найти соответствующие библиотеки.
Это означает, что если вы вызовете скрипт напрямую, rubygems не будут загружены, поэтому путь загрузки не будет настроен правильно, и, как вы видели, вы получите ошибки об отсутствующих зависимостях. Чтобы продемонстрировать это, попробуйте запустить
$ ruby -rubygems /Library/Ruby/Gems/1.8/gems/heroku-1.18.3/bin/heroku
, который запускает скрипт, но сначала загружает rubygems. Это должно (возможно - я не знаю наверняка) работать.
Именно поэтому bundle exec heroku
работает. Bundler устанавливает путь загрузки по мере необходимости. Кроме того, это гарантирует, что путь загрузки настроен так, чтобы он соответствовал вашему файлу Gemfile.lock
- это действительно точка компоновщика.
Я бы не рекомендовал добавлять что-либо к вашему $PATH
. Как мы уже видели, он не работает, но вам также придется менять его каждый раз, когда вы обновляетесь до новой версии драгоценного камня heroku.
Я бы также не рекомендовал добавлять что-либо в вашу переменную $RUBYLIB
. Это может фактически заставить работать команду heroku, но весь смысл использования rubygems и bundler состоит в том, что они управляют такими вещами для вас.
Моя первая рекомендация будет использовать rvm . Это очень полезный инструмент, и я думаю, что стоит потратить некоторое время на его изучение.
Если вы не можете или не хотите этого делать, то вам, вероятно, нужно переустановить гем heroku и проверить, правильно ли он установлен. Сначала удалите существующий драгоценный камень с помощью:
$ sudo gem uninstall heroku
Затем убедитесь, что у вас установлена последняя версия пакета:
$ sudo gem update bundler
Наконец переустановите с
$ bundle install
и он должен попросить ваш пароль для установки исполняемых файлов в нужном месте. Примечание не используйте sudo
здесь - подробности см. По ссылке выше.