我有一個rails web應用程序,允許用戶使用多個服務器運行自動化任務。我連接了一個rake任務,每5分鐘運行一次(每當gem時)並檢查需要執行的作業,並使用適當的選項啓動服務器。從Rake運行廚師刀
我的麻煩是在實際運行廚師刀的命令。我目前是這樣做的:
sh %{bash -c -l 'cd ~/opscode/FTW && source ~/.rvm/scripts/rvm && rvm use system && knife rackspace server list'} do |ok, res|
if ! ok
puts "meh? (status = #{res.exitstatus})"
puts res
end
end
這讓我一半在那裏。它切換到合適的寶石(系統),沒有任何麻煩,但對刀的執行,我得到如下:
Could not find multi_json-1.1.0 in any of the sources
Run `bundle install` to install missing gems.
我沒有在系統中安裝寶石捆綁......所以我很困惑。我的web應用程序需要multi-json-1.1.0。我的廚師安裝似乎需要multi_json 1.0.3,所以似乎在gem需求中混淆了。
從bash的命令運行沒有問題......它只是在刀部分
任何想法未能抽傭?
編輯:使用mpapis建議 我使用的RVM寶石,一切都在IRB的偉大工程。我做了以下
RVM.use! 'system'
env = RVM.current
env.shell_wrapper.run_command("cd /my/path/to/opscode/FTW && knife rackspace server list")
但是,當在rails控制檯或從耙子運行相同的代碼我有問題。 Rails控制檯基本上忽略了我的RVM.use!耙子吹起來......這是否與捆綁商干擾有關?
解決方案: mpapis構建了一個驚人的寶石https://github.com/mpapis/rvm-with,允許您在特定的ruby版本內執行代碼。
RVM.with '1.8.7' do |r|
puts r.execute "unset RUBYOPT"
puts r.execute "cd /home/hunter/opscode/FTW && knife rackspace server list"
#puts r.execute "ruby --version"
end
然後我該用什麼?我嘗試使用%x {},系統和''來執行命令。系統給出了相同的錯誤,而''和%x {}是等價的,並給出: .rvm/gems/ruby-1.9.2-p290 @ global/gems/bundler-1.0.21/lib/bundler/spec_set.rb: 88:在'materialize'中:在任何源代碼中找不到multi_json-1.1.0(Bundler :: GemNotFound) – 2012-03-27 03:22:42
是不是可以通過rake執行rvm?這將是相當不幸的 – 2012-03-27 20:37:21
有rvm-ruby integration => https://github.com/wayneeseguin/rvm-gem的gem,如果它缺少一些功能主義者 - 你可以分叉並添加它 - 或者打開問題以便其他人可以看看它後來 – mpapis 2012-03-27 23:26:16