我如何需要宝石?

时间:2012-01-07 20:19:10

标签: ruby

我是Ruby的新手,我正在编写一个纯Ruby脚本,而不是Rails。

这个脚本很简单:

require 'progressbar'

bar = ProgressBar.new("Example progress", 50)
total = 0
until total >= 50
  sleep(rand(2)/2.0)
  increment = (rand(6) + 3)
  bar.inc(increment)
  total += increment
end

当我运行它时,我明白了:

./progressbar.rb:3: uninitialized constant ProgressBar (NameError)
from progressbar.rb:1:in `require'
from progressbar.rb:1

安装了宝石。我做错了什么?

4 个答案:

答案 0 :(得分:2)

根据回溯来判断,我认为ruby实际上是在尝试加载你的progressbar.rb而不是gem中的那个。

在1.9之前,您还应该require 'rubygems'以便加载rubygems库本身

答案 1 :(得分:2)

如果您使用的是Ruby 1.8.x,请尝试将源文件重命名为progressbar_test.rb并运行它。有可能就是这样,因为你的require语句试图加载你自己的源文件而不是gem中的那个。

答案 2 :(得分:2)

假设您使用的是Ruby 1.8,我会将问题中的文件从progressbar.rb重命名为pg_test.rbprogressbar.rb以外的其他任何内容。

require 'rubygems'
require 'progressbar'

bar = ProgressBar.new("Example progress", 50)
total = 0
until total >= 50
  sleep(rand(2)/2.0)
  increment = (rand(6) + 3)
  bar.inc(increment)
  total += increment
end

在shell中:

$ ruby ./pg_test.rb

答案 3 :(得分:0)

到目前为止,

Bundler是管理ruby应用程序中依赖项的最佳解决方案。

$ gem install bundler
$ bundle gem <gem-name>

您将获得如下所示的ruby gem库的标准文件结构:

my_awesome_gem
  Gemfile
  my_awesome_gem.gemspec
  Rakefile
  lib
    my_awesome_gem.rb
    my_awesome_gem
      version.rb

打开你的Gemfile并像这样添加你的依赖

gem 'progressbar'

然后在lib / my_awesome_gem.rb中执行此操作:

require 'bundler/setup' #initialize bundler, which works its magic on your load path
require 'progressbar' #require whatever gems (make sure they're listed in your Gemfile)

bar = ProgressBar.new("Example progress", 50)
total = 0
until total >= 50
  sleep(rand(2)/2.0)
  increment = (rand(6) + 3)
  bar.inc(increment)
  total += increment
end

最后,运行你的脚本:

$ ruby lib/my_awesome_gem.rb

Bunder绝对是最好的方法。您不会遇到ruby版本差异的问题,并且您知道您的脚本将符合ruby社区的标准和最佳实践。我强烈建议从一开始就使用bundler。这也有助于您开始添加测试,因为您已经设置为启动require您在测试中列为依赖项的任何宝石。

另外,如果您的脚本达到了您要分发的程度,那么它已经设置为发布到rubygems.org。

查看yehuda katz的this blog post了解更多信息。