使用 Apache 托管 Ruby gem
Posted
技术标签:
【中文标题】使用 Apache 托管 Ruby gem【英文标题】:Hosting Ruby gems using Apache 【发布时间】:2013-04-04 16:30:18 【问题描述】:我无法弄清楚如何使用 Apache 托管我自己创建的 Ruby gem。我想知道是否有人可以帮助我找出问题所在。
这是我到目前为止所做的。我首先创建了自己的“hello world”gem(关注these instructions):
$ bundle gem helloearth
$ cat lib/helloearth.rb
require "helloearth/version"
module Helloearth
def self.hi
puts "hello world"
end
end
$ cat helloearth.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'helloearth/version'
Gem::Specification.new do |spec|
spec.name = "helloearth"
spec.version = Helloearth::VERSION
spec.authors = ["Some Guy"]
spec.email = ["someguy@example.com"]
spec.description = %qa gem description
spec.summary = %qa gem summary
spec.homepage = "http://www.example.com"
spec.license = "MIT"
spec.files = `git ls-files`.split($/)
spec.executables = spec.files.grep(%r^bin/) |f| File.basename(f)
spec.test_files = spec.files.grep(%r^(test|spec|features)/)
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.3"
spec.add_development_dependency "rake"
end
然后我构建了 gem,安装并运行它以验证它是否有效:
$ gem build helloearth.gemspec
Successfully built RubyGem
Name: helloearth
Version: 0.0.1
File: helloearth-0.0.1.gem
$ gem install ./helloearth-0.0.1.gem
Successfully installed helloearth-0.0.1
1 gem installed
Installing ri documentation for helloearth-0.0.1...
Installing RDoc documentation for helloearth-0.0.1...
$ irb
1.9.3-p362 :001 > require 'helloearth'
=> true
1.9.3-p362 :002 > Helloearth.hi
hello world
=> nil
有效!现在我要卸载我的“hello world”gem(通过清空整个 gemset),然后从服务器重新安装它:
$ rvm gemset empty currentgemset
Are you SURE you wish to remove the installed gems for gemset 'ruby-1.9.3-p362@currentgemset' (/home/joe/.rvm/gems/ruby-1.9.3-p362@currentgemset)?
(anything other than 'yes' will cancel) > yes
我需要设置 Apache 来托管这个 gem。我是按照http://docs.rubygems.org/read/chapter/18#page81 的说明进行操作的:
$ sudo mkdir /var/www/gems
$ sudo cp helloearth-0.0.1.gem /var/www/gems
$ rvmsudo gem generate_index -d /var/www/gems/
Warning: can not check `/etc/sudoers` for `secure_path`, falling back to call via `/usr/bin/env`, this breaks rules from `/etc/sudoers`. export rvmsudo_secure_path=1 to avoid the warning.Generating Marshal quick index gemspecs for 0 gems
Complete
Generated Marshal quick index gemspecs: 0.000s
Generating Marshal master index
Generated Marshal master index: 0.000s
Generating specs index
Generated specs index: 0.000s
Generating latest specs index
Generated latest specs index: 0.000s
Generating prerelease specs index
Generated prerelease specs index: 0.000s
Compressing indicies
Compressed indicies: 0.001s
$ ls /var/www/gems
helloearth-0.0.1.gem Marshal.4.8.Z specs.4.8
latest_specs.4.8 prerelease_specs.4.8 specs.4.8.gz
latest_specs.4.8.gz prerelease_specs.4.8.gz
Marshal.4.8 quick
Apache 现在托管 gem,我可以使用位于 localhost/gems 的 Web 浏览器成功访问此目录。但是,我无法从 Apache 服务器安装我的 gem:
$ gem sources -a http://localhost/gems/
http://localhost/gems/ added to sources
$ gem sources
*** CURRENT SOURCES ***
http://rubygems.org/
http://localhost/gems/
cd ~ # leave the directory which holds the local copy of the gem to force use of the Apache server
$ gem install helloearth
ERROR: Could not find a valid gem 'helloearth' (>= 0) in any repository
ERROR: Possible alternatives: hello_bar, hello_ext, hellogr, helloh, hellolorem
我还尝试添加 127.0.0.1/gems/ 和 0.0.0.0/gems/ 作为 gem 源,但都没有解决问题。有人告诉我在对 $ gem generate_index 的调用中添加 --legacy 标志,但这也不起作用。
【问题讨论】:
您是否已将 apache 配置为从 /var/www/gems 提供文件? @Frederick Cheung 没有明确表示,但正如我在帖子中提到的那样,我可以在我的网络浏览器中看到它们,这证明了这些文件正在被提供 【参考方案1】:helloearth-0.0.1.gem 不在 gem generate_index 的正确位置。
如果您希望来源为 /gems,则 .gem 文件需要位于 /var/www/gems/gems 中
gem generate_index -d 调用位于父目录 (BASEDIR) 上,.gem 文件位于 /gems 子目录中。
http://docs.rubygems.org/read/chapter/18 "How do I run a Gem Server like RubyForge?"
【讨论】:
以上是关于使用 Apache 托管 Ruby gem的主要内容,如果未能解决你的问题,请参考以下文章
使用来自 GitLab 的私有 gem 构建一个 Ruby 项目
乘客:无法加载此类文件 rubygems/builder