2014-01-24 260 views
4

我想建立一個命令行。我使用bundler來創建gem並在本地安裝gem。它生成了所需的目錄。我也能測試,如果我需要我的寶石我可以用它裏面的方法。我試圖讓命令行塊現在工作,似乎無法得到它的工作。我希望能夠像做紅寶石寶石命令行工具

gemname command 

方式類似,作品:

rspec test/whatever.rb 

如何能夠通過命令行來執行將是巨大的任何幫助。

+0

你必須自己實現二進制/命令行工具。例如https://github.com/jimweirich/rake/tree/master/bin – mhutter

+0

你能解釋一些嗎?所以我創建了這個可執行文件,然後運行bundle install,它應該可以工作?此外,當它Rake.application.run是特定於耙命令?我需要在我的寶石?當我運行mygem mycommand時,它只是說沒有找到命令mygem – wallerjake

回答

0

結帳這些博客文章: http://robdodson.me/blog/2012/06/14/how-to-write-a-command-line-ruby-gem/ http://rubylearning.com/blog/2011/01/03/how-do-i-make-a-command-line-tool-in-ruby/

我真的不知道,到目前爲止,你已經建造的,但這裏有感興趣的幾個要點:

  1. #!/usr/bin/env ruby在第一線可執行文件(在/bin文件夾中)。
  2. chmod +x filname使其可執行
  3. ARGV[0]變量從ARGV[0]
  4. s.executables << 'your_file'檢索通過添加可執行gemspec
+0

好吧,看來我可以運行bin/mycommand而不是gemname mycommand是否它是如何工作的?我是否需要配置一些東西才能運行gemname mycommand? – wallerjake

+0

增加了'executables'行。試一試 – AdamT

+0

這就是寶石寶石給我的那個。 spec.executables = spec.files.grep(%r {^ bin /}){| f | File.basename(f)}這是不正確的?我應該試着將特定的文件放到位嗎?我也需要重新加載Gem bundle安裝嗎? – wallerjake

2

爲了宣告你只是作出適當的線在你可執行文件yourgem.gemspec

`git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } 

該行以及其他有用的行由bundle gem yourgem命令生成。只要執行它,然後根據你的需要修復yourgem.gemspec。把可執行文件到斌/你的寶石文件夾,所有的圖書館,包括版本,爲的lib/文件夾。

下一步是使用二進制。當你安裝到系統中,二進制文件夾會自動納入二進制搜索路徑。所以你的寶石可以從任何地方執行。但是,當沒有安裝你的寶石,你仍然可以用的exec來simelate情況如下:

bundle exec bin/your_exec 

它選擇了從的lib/夾起來需要librarires,和可執行文件將工作正常。

要確保可執行文件能夠正常工作,請使用gem build yourgem.gemspec構建寶石,然後使用gem install yourgem.gem進行安裝,然後嘗試。

+0

好吧,所以這似乎工作時,我使用軟件包執行bin/my_exec。所以當我發佈這個時,你說用戶將能夠運行mygemname mycommand?我可以在將它發佈到rubygems之前在本地進行測試嗎? – wallerjake

+0

@wallerjake當然是建立gem'gem build yourgem.gemspec',然後安裝它'gem install yourgem.gem' –

+0

是的,它說它已經安裝了,但是當我輸入我的gemname mycommand它說沒有找到gemname。成功安裝gemname-0.0.1 解析文檔gemname-0.0.1 的安裝文件裏gemname-0.0.1 1寶石安裝 – wallerjake

0

我想到了這一點,至少對於我的具體問題。我只需要直接調用bin命令而不是那個git ls循環。由於某種原因,最上面的那個不起作用。

spec.executables = ["toolshed"]

VS

spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

2

我認爲問題是,你還沒有COMMITED你的代碼呢。 檢查git ls-files -- bin/*是否顯示您要執行的腳本。

當你提交你的文件,然後git ls-files將返回它,該規範將能夠加載腳本。

+0

我覺得@МалъСкрылевъ的[answer](http://stackoverflow.com/a/21373096/2661448)是指向同一方向。學分給他! – delucas

+0

是的我相信你是對的。我暫時離開了它,但我打算再次回來並更新。謝謝! – wallerjake