2012-03-09 32 views
3

我正在寫一個紅寶石,用戶可以安裝並使用命令行紅寶石工具與服務進行交互。你可以啓動和停止服務(它會產生一個子進程)。我該如何構建我的紅寶石命令行服務?

我已經做了大量的研究,用於編寫網絡服務的最佳方法,例如ØMQ/ EventMachine,並且我得到了如何創建一個Ruby gem來安裝可以在命令行中使用的二進制文件,但我正在努力設定一個好的代碼結構。我的命令行實用程序將採用各種參數(我將使用Trollop),它將使用各種類來做事情,並使用各種其他紅寶石寶石。

我不知道應該在哪裏放置我的類文件,以及如何在我的二進制文件中要求它們,以便路徑正確。

回答

8

很大程度上,RubyGems會爲您處理這個問題。您需要將您的可執行文件包含在files列表中,並將其放入您的gemspec中的executables。這是常見的把你的可執行文件中bin在你的目錄,例如:

$ ls 
bin/ myapp.gemspec lib/ Rakefile 
$ ls bin 
bin/myapp 

然後你gemspec會是什麼樣子:

Gem::Specification.new do |s| 
    s.name = 'myapp' 

    # whatever else is in your gemspec 

    s.files = ["bin/myapp","lib/myapp.rb"] # or whatever other files you want 
    s.executables = ["bin/todo"] 
end 

在這一點上,當用戶安裝通過RubyGems的您的應用程序,myapp會在他們的道路,並lib會在你的應用程序的loadpath,讓您的可執行文件可以簡單地開始了:

#!/usr/bin/env ruby 

require 'myapp' 
# whatever other requires 

唯一的問題是,在開發過程中,您不能僅僅執行bin/myapp並讓您的應用程序運行。有些開發人員通過$:$LOAD_PATH操縱負載路徑,但這被認爲是不好的形式。

如果使用捆綁,這是最簡單的只是bundle exec本地運行你的應用程序,例如bundle exec bin/myapp。您可以交替使用RUBYLIB環境變量,例如RUBYLIB=lib bin/myapp,這會將lib置於加載路徑中。

0

由於所有的寶石都是開源的,你可以隨時看看一些比較好的例子。使用像jewelerhoe這樣的寶石生成器也會爲你設置一些組織上的基本結構。

+3

「源可用」可能是一個更好的術語。僅僅因爲你可以看到源代碼並不意味着它是通常意義上的「開源」軟件。 – 2012-03-09 21:31:05

+0

謝謝,我會看看那些!我不是白天的紅寶石開發人員,所以我正在努力找到一個好的基礎。 – tarnfeld 2012-03-09 21:44:18

+0

我的意思是更多的「開源」,因爲我不知道任何有意混淆的東西。這就是「開放源碼」和「免費開源」的不同之處。儘管如此,絕大多數寶石都是以某種開源許可證的形式出版的。 – tadman 2012-03-10 00:07:51

4

可以生成Bundler寶石項目結構。

簡述:

安裝捆紮機

$ gem install bundler 

使用捆紮機生成寶石項目

$ bundle gem myapp 
$ cd myapp 

添加可執行

$ mkdir bin 
$ cat > bin/mycommand << EOSCRIPT 
    #!/usr/bin/env ruby 

    require 'myapp' 

    puts "Executing myapp" 
    EOSCRIPT 
$ chmod +x bin/mycommand 

安裝您的寶石

$ rake install 

運行腳本

$ mycommand 
Executing mycommand 

分享到rubygems.org

$ rake release 
您的公用事業

更多文檔the website