2012-02-14 48 views
0

我对ruby一无所知,任何人都可以帮忙解释这个脚本在做什么吗?ruby​​脚本说明请

#!/usr/bin/env ruby 
begin 
    require '/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.22/lib/bundler' 
    # Check if an older version of bundler is installed(this part i understand) 
    $:.each do |path| 
    if path =~ %r'/bundler-0.(\d+)' && $1.to_i < 9 
     err = "Please remove Bundler 0.8 versions." 
     err << "This can be done by running `gem cleanup bundler`." 
     abort(err) 
    end 
    end 
    #it is from here that i dont understand 
    require '/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.22/lib/bundler/cli' 
    Bundler::CLI.start 
    rescue Bundler::BundlerError => e 
    Bundler.ui.error e.message 
    Bundler.ui.debug e.backtrace.join("\n") 
    exit e.status_code 
    rescue Interrupt => e 
    Bundler.ui.error "\nQuitting..." 
    Bundler.ui.debug e.backtrace.join("\n") 
    exit 1 
    end 

这里我IRB测试:

/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.22/bin$ irb 
irb(main):001:0> require 'bundler' 
LoadError: no such file to load -- bundler 
from (irb):1:in `require' 
from (irb):1 
from :0 
irb(main):002:0> require 'bundler/cli' 
LoadError: no such file to load -- bundler/cli 
from (irb):2:in `require' 
from (irb):2 
from :0 
irb(main):003:0> Bundler::CLI.start 
NameError: uninitialized constant Bundler 
from (irb):3 
from :0 
irb(main):004:0> 

感谢

+0

是我得到的错误:/usr/lib/ruby/gems/1.9.1/gems/bundler-1.0.22/bin/bundle:14:in rescue in ':未初始化的常量Bundler :: BundlerError(NameError) 这就是为什么bundler cli不想因为上述原因而启动的原因?谢谢 – 2012-02-14 11:35:11

+0

'require'/ usr/lib/ruby​​/gems/1.9.1/gems/bundler-1.0.22/lib/bundler''可能是失败的那一行。那个地方有文件吗? – seb 2012-02-14 11:36:32

+0

是一个名为bundle的可执行文件:-rwxr-xr-x 1 root root 699 2012-02-14 09:48 bundle – 2012-02-14 11:42:31

回答

0

它试图启动打捆CLI,如果它得到BundlerError或中断,它会打印堆栈跟踪并退出与一个状态码。用一个Gemfile从一个irb运行相同的代码,看看会发生什么。它看起来像是从命令行执行bundle install会发生什么情况。


$ irb 
ruby-1.9.3-p0 :001 > require 'bundler' 
=> true 
ruby-1.9.3-p0 :002 > require 'bundler/cli' 
=> true 
ruby-1.9.3-p0 :003 > Bundler::CLI.start 
+0

yikes我不知道该怎么做,我从来没有用过这个东西。它超出了我的范围。请问我该如何做:在一个具有Gemfile的目录中从irb运行相同的代码? – 2012-02-14 11:46:25

+0

@charlie_cat查看编辑答案。你进入一个带Gemfile的目录,键入'irb',需要所需的东西,然后输入你想要运行的代码。但是,如果它“超出你的范围”,你应该花时间理解你在做什么,为什么。 – 2012-02-14 11:58:06

+0

我在我的主帖中发布了我的输出:) – 2012-02-14 12:22:04

0

我不知道你有什么不明白......你可以更具体一点吗?

rescue位是早些时候与begin有关的条款。这就像Java中的try/catch,如果这对你来说意味着什么。

这意味着,“尝试做beginend之间所有的东西,但如果BundlerError情况发生,那么做到这一点,如果Interrupt错误发生,做到”

是否回答你的问题?