我是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
安装了宝石。我做错了什么?
答案 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.rb
或progressbar.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了解更多信息。