什么决定宝石的安装位置?

时间:2011-12-23 13:24:18

标签: ruby rubygems

我正在尝试在我的网络主机上设置Sinatra应用。我没有sudo权限在系统范围的路径中安装gems,这是/usr/local下面的几个子文件夹,但我的应用程序目录中有一个gems文件夹。

背景

This reference给出以下定义:

  • GEM_HOME - “包含主宝石存储库的目录。”
  • GEM_PATH - “除了GEM_HOME目录之外还包含要搜索的gem存储库的目录的路径列表。列表应该由相应的路径分隔符分隔(例如,Unix上的':'和Windows上的';' )“

登录时的初始设置

当我第一次访问此网络托管服务商时,echo $GEM_HOMEecho $GEM_PATH都会生成一个空字符串,但gem list会显示多个宝石。

尝试更改宝石位置

在命令行中,我设置了GEM_HOME,如下所示:

GEM_HOME=$PWD/gems # 'gems' folder under present working directory
echo $GEM_HOME     # correctly outputs the gem folder I specified
ls $GEM_HOME       # shows gems folder contents, namely: 
                   # bin/ cache/ docs/ gems/ specifications/

我还将GEM_PATH设置为同一个文件夹。

执行此操作后,gem list仍会显示全局宝石,而不是指定文件夹中的宝石,gem install仍会尝试安装到全局位置。

我缺少什么?

3 个答案:

答案 0 :(得分:2)

gem没有联合帮助页,但这并不容易。我假设GEM_PATH是寻找宝石的地方,GEM_HOME是安装宝石的地方。尝试

export GEM_HOME = "$GEM_PATH"

答案 1 :(得分:2)

使用'export'

如Tass所示,export看起来像是缺失的部分:它使我的本地GEM_HOME变量成为全局变量。

这就是我所做的:

export GEM_HOME=$PWD/gems       # where to install and look for gems
export PATH=$PWD/gems/bin:$PATH # append the gems' binaries folder to
                                # the current path, so that I can call
                                # `bundle install` and have it find
                                # myapp/gems/bin/bundle

答案 2 :(得分:1)

您也可以使用Bundler。即使无法进行sudo访问,Bundler也可以轻松管理Gem版本。您在应用程序的根目录中创建一个名为Gemfile的文件,并添加以下行:

gem "sinatra"
gem "some_other_gem_dependency"
gem "and_so_on_and_so_forth", ">= 1.0"

然后运行bundle install --path /where/you/want/your/gems/stored,它会将宝石安装到您有权访问的路径。然后你把它放在你的config.ru:

require 'rubygems'
require 'bundler'

Bundler.require
require './your_app'
run YourApp

查看http://gembundler.com/sinatra.html了解详情。