2014-01-13 17 views
1

我是Ruby的新手,並試圖編寫一個優雅的方法來設置程序的工作目錄。所有文件訪問都是相對於此路徑。如果使用OptionParser未定義路徑,我該如何調用幫助?

該程序可能會也可能不會從Git倉庫中運行。我也想提供一個覆蓋路徑的方法。

我正在使用OptionParser,並且難以正確設置選項。看起來work_area總是被設置爲Git頂層,無論我是否使用--work_area標誌。我嘗試在opts.on內使用||運算符,但這也不起作用。

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: mysprogram.rb [options]" 

    options[:work_area] = `git rev-parse --show-toplevel --quiet 2>/dev/null` 
    opts.on("-d", "--work_area", String, "Override default work area.") do |wa| 
    options[:work_area] = wa 
    end 
    if options[:work_area] 
    puts "Work area is " + options[:work_area] 
    else 
    puts "ERROR: Valid work directory not found or specified." 
    puts opts 
    exit 
    end 

    opts.on_tail("-h", "--help", "Show this message") do 
    puts opts 
    exit 
    end 
end.parse! 

任何關於我做錯了什麼的建議,或者如何使這更像Ruby,將不勝感激。

回答

1

傳遞給opts.on("-d" ...)塊被稱爲則傳遞到OptionParser.new塊後,所以你puts語句的參數解析是實際發生之前執行。試試吧初始化爲默認值(並對其進行測試)外OptionParser.new塊的全部:

options = {} 
opts = OptionParser.new do |opts| 
    opts.banner = "Usage: mysprogram.rb [options]" 

    opts.on("-d", "--work_area", String, "Override default work area.") do |wa| 
    options[:work_area] = wa 
    end 

    opts.on_tail("-h", "--help", "Show this message") do 
    puts opts 
    exit 
    end 
end 
opts.parse! 

# Notice the "||=" here; this means "set options[:work_area] to a new thing 
# only if it's not nil or false." 
options[:work_area] ||= `git rev-parse --show-toplevel --quiet 2>/dev/null` 

if options[:work_area] 
    puts "Work area is " + options[:work_area] 
else 
    puts "ERROR: Valid work directory not found or specified." 
    puts opts 
    exit 
end 
+0

使opts不工作,因爲它在解析器do/end之外。我試着把選項[:幫助],但結果是「無」。有什麼想法嗎? –

+0

這是由於我的一個複製和粘貼錯誤。這應該會好一點。 –

1

我一直使用的都是一樣的東西:

require 'optparse' 

options = {} 
OptionParser.new do |opt| 
    opt.banner = "Usage: #{ File.basename($0) } [options]" 
    opt.on('--path PATH') { |o| options[:path] = o } 
    options[:help] = opt.help 
end.parse! 

puts options[:help] if !options[:path] 

保存這一點,與--path foo選項返回運行它沒有輸出,因爲它應該。

運行它沒有--path foo選項輸出:

 
Usage: test.rb [options] 
     --path PATH 

另外,注意OptionParser自動提供一個-h--help參數爲你,如果你不定義它們。使用-h調用相同的代碼會得到您期望的輸出結果,並試圖將代碼寫入腳本。

+0

-h拋出一個模棱兩可的選項錯誤,所以我不得不將它添加到解析器。 - 幫助沒有添加。我還注意到,我將它們編碼爲布爾標誌,而不是ARGV,它可以接受字符串,例如「--path」與「--path PATH」或「--path [PATH]」,因爲我希望這是可選的。 –

+0

我試圖把選項[:幫助],並返回零。我試着評論我對幫助的重新定義,並得到相同的結果。有任何想法嗎? –

相關問題