如何在AWS上卸载bundler(以及本地和系统范围内的宝石之间的区别)

时间:2013-12-08 06:07:34

标签: ruby-on-rails ruby amazon-web-services rubygems gem

当我在我的AWS实例上运行bundle install时,我的gemfile上出现此语法错误:

Gemfile syntax error:
/var/www/mheesen.cc/releases/20131206072125/Gemfile:18: syntax error, 
unexpected ':', expecting kEND
...tter-bootstrap-rails', github: 'seyhunak/twitter-bootstrap-r...
                              ^

这是一个通常与我安装了Ruby 1.8相关的错误,但通过键入ruby -v,我得到了ruby 1.9.3

进一步挖掘,我读了“error in your Gemfile, and Bundler cannot continue”,并认为可能是因为我的捆绑器使用的是系统Ruby而不是本地系统。 (我不确定这是怎么回事,但是很好。)

我认为最好的补救措施是卸载bundler gem并重新安装它,希望它能用正确的Ruby版本选择合适的捆绑器但是尝试在我的项目目录上卸载会给我这个错误:

path/to/my/project$ gem uninstall bundler
ERROR:  While executing gem ... (Gem::InstallError)
    bundler is not installed in GEM_HOME, try:
    gem uninstall -i /usr/local/rvm/gems/ruby-1.9.3-p484@global bundler

这证实了我怀疑它正在使用系统范围的捆绑包,但是然后尝试卸载该系统范围的捆绑包会给我一个权限错误:

gem uninstall -i /usr/local/rvm/gems/ruby-1.9.3-p484@global bundler
Remove executables:
    bundle

in addition to the gem? [Yn]  Y
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the 
    /usr/local/rvm/gems/ruby-1.9.3-p484@global/bin directory.

我尝试更改所述文件夹的权限..也没有权限这样做。

尝试更新项目中的bundler也告诉我一切都是最新的。

我现在该怎么办?我有什么选择?我的想法已经不多了。

2 个答案:

答案 0 :(得分:2)

快速修复:

$ cd /var/www/mheesen.cc/releases/20131206072125
$ sudo gem install bundler # Since "bundler is not installed in GEM_HOME"
$ sudo bundle install

长期修复:

您似乎已将RVM安装为系统包,可能是通过sudo apt-get install rvm。如果可能,请卸载并使用RVM install guide进行安装。请勿使用sudo安装。

步骤:

# Uninstall system package RVM (in flavor of RVM user install method)
$ sudo apt-get remove rvm

# Don't edit your bashrc. RVM alone will attempt to setup your shell (2013)
$ \curl -sSL https://get.rvm.io | bash
$ source ~/.rvm/scripts/rvm

$ rvm requirements  #=> will install gawk, g++, libreadline6-dev, etc...
$ rvm install 1.9.3
$ rvm use --default 2.0.0

您应该使用此内容强制执行ruby版本,以便在项目目录中的.ruby-version文件中使用(提交此更改并再次部署):

$ vim .ruby-version
1.9.3

作为奖励,您可以用最新最好的替换旧系统ruby 1.8.7:

# Use this to replace old 1.8.7 on your system
$ git clone https://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ ./install.sh

$ ruby-build 2.0.0-p353 /usr/local

关于GEM_HOME和相关的说明:

  

GEM_PATH提供可以找到宝石的位置(可能有几个)

     

GEM_HOME是安装宝石的地方(默认情况下)

     

因此GEM_PATH应该包含GEM_HOME

答案 1 :(得分:2)

虽然答案得到了正确的answered ..我会记下一些注释仅供我自己参考(希望它对其他人有用)。我将用一个例子来解释:

假设我们想杀死在我们的AWS上运行的thin服务器..为此我们这样做:

  • 运行ps aux | grep thin
  • 找到pid,然后运行sudo kill -9 pid
  • 这是重要的部分:重启服务器,我们运行rvmsudo thin start -p 80 -d
    • -p是选择端口号,-d是作为守护进程运行

注意我们如何使用rvmsudo而不仅仅是rvm(请注意,这是rvm特有的...不要四处认为你可以将sudo粘贴到任何随机命令)这是因为如上所述,有两种宝石:

  1. 系统范围
  2. 本地
  3. 当你输入sudo install gem或sudo gem做某事时,sudo会让你进入系统环境,因此你正在使用系统范围的宝石。

    同样..如果您只是安装没有sudo的gem,那么你只是安装一个本地gem。话虽如此......您可能仍然希望本地宝石执行需要root权限的操作.. 当rvmsudo发挥作用并执行rvmsudo thin start ..之类的操作时...您正在使用本地宝石但具有root权限。