2012-02-14 46 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錯誤發生,做到」

是否回答你的問題?