我正在尝试在我的网络主机上设置Sinatra应用。我没有sudo权限在系统范围的路径中安装gems,这是/usr/local
下面的几个子文件夹,但我的应用程序目录中有一个gems
文件夹。
This reference给出以下定义:
GEM_HOME
- “包含主宝石存储库的目录。”GEM_PATH
- “除了GEM_HOME目录之外还包含要搜索的gem存储库的目录的路径列表。列表应该由相应的路径分隔符分隔(例如,Unix上的':'和Windows上的';' )“当我第一次访问此网络托管服务商时,echo $GEM_HOME
和echo $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
仍会尝试安装到全局位置。
我缺少什么?
答案 0 :(得分:2)
gem
没有联合帮助页,但这并不容易。我假设GEM_PATH
是寻找宝石的地方,GEM_HOME
是安装宝石的地方。尝试
export GEM_HOME = "$GEM_PATH"
答案 1 :(得分:2)
如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