2014-04-02 61 views

回答

23

我有一些運氣這種方法:

class CLI < Thor 
    map %w[--version -v] => :__print_version 

    desc "--version, -v", "print the version" 
    def __print_version 
    puts FooBar::VERSION 
    end 
end 

領先的下劃線,確保沒有像yourapp version一個命令,部隊yourapp --versionyourapp -vdesc內容將允許它顯示爲-v, --version而不會暴露__print_version

+0

這是bundler所做的一件事。只有他們只是稱之爲任務版本,並讓人們用'bundler version'調用它(因爲爲什麼不呢?)https://github.com/bundler/bundler/blob/6afa89217cf052c58316da1f2be7bf54749ff9de/lib/bundler/cli.rb#L312- L316 – ZombieDev

+2

這應該提交給Thor devs進行文檔修復。 –

1

到目前爲止,我提出的最佳選擇是創建一個布爾類選項,它不屬於任務,可以由其他任務引用。經常使用的類選項示例爲-v詳細信息,因爲所有任務都可以使用它來確定它們應該有多嘈雜。

然後創建一個'版本'任務並將其設置爲默認任務,因此當沒有任務定義時,版本任務會運行並且可以對--version標誌(類選項)做出反應。

class CLI < Thor 
    #include Thor::Actions 
    class_option :version, :type => :boolean 

    desc "version", "Show thor_app version" 
    def version 
    if options[:version] 
     puts "thor_app version #{find_version}" 
    end 
    end 
    default_task :version 

    no_tasks do 
    def find_version 
     ## Method can be replaced to look up VERSION 
     '1.0.0' 
    end 
    end 
end 
0

我不喜歡接受的解決方案;它最終列出了version作爲命令,列出了--version--no-version作爲全局選項,並且如果腳本運行時沒有選項,它就沒有提供幫助。

我已經能夠拿出是做托爾外最好的:

class CLI < Thor 
    . 
    . 
    . 
end 

if ARGV[0] == "--version" 
    puts "MyApp #{MyApp::VERSION}" 
    exit 
end 

CLI.start 

這有輕微缺點--version不記錄任何地方。

+1

「我不喜歡接受的解決方案」 - 只是爲了後人,這最初是指摩根的答案(http://stackoverflow.com/a/22809973/528044)。 –