2013-11-25 32 views
5

在我的大集合Ruby腳本的,我做的共同家當開始我的劇本:家當了多個版本

#!/usr/bin/env ruby 

現在我發現一些腳本,確實需要一定的Ruby版本,沒有,他們是沒有Rails應用程序可以在特定的Ruby版本下部署。它們只是單個文件腳本,可以從命令行啓動並且無法使用系統版本。

有沒有什麼辦法可以在運行下面的代碼的文件之前編寫一個用rbenv/rvm設置環境的shebang?

+0

你怎麼知道每個腳本需要ruby?看起來,無論你有查找問題,還是文件組織問題在這裏解決。 –

回答

1

您不一定需要設置任何環境。所有你需要的是你想運行的ruby二進制文件的路徑,其他所有內容都將遵循。

這裏是你如何可以設置它的例子:

  1. 創建一個文件夾~/bin。這將持有指針(符號鏈接)到所有你個人的ruby二進制文件。

  2. 更新您的shell PATH,以便~/bin包含在可執行文件的搜索路徑中。

  3. 將符號~/bin中所需的任何ruby二進制符號鏈接到實際的ruby二進制文件。

舉例來說,在我的~/bin我:

ruby18 -> /opt/ruby18/bin/ruby 
ruby19 -> /opt/ruby19/bin/ruby 
ruby20 -> /opt/ruby20/bin/ruby 

現在讓我們假設你有一個腳本,需要1.9運行。然後,所有你需要做的是:

#!/usr/bin/env ruby19 

,如果你已經安裝了你的寶石成每個Ruby可執行文件的默認目錄寶石這將工作。如果您在其他地方安裝了寶石,則會變得更加複雜,您需要在運行腳本之前修改GEM_PATH

如果你不想讓花哨~/bin然後就死您的家當行,而不是直接指向紅寶石二進制:

#!/opt/ruby19/bin/ruby 

...或等值rbenv/RVM路徑。

在你的~/bin有符號鏈接雖然可以讓你如果讓我們說你Ruby編譯1.9的一個新的補丁更容易地更新你的容器指針,並希望把它放在像/opt/ruby19-p123另一個文件夾。然後,您只需更新~/bin中的符號鏈接,並且所有腳本都將運行新的修補版本。

1

rbenv將尋找.ruby-version文件通過(例如)

$ rbenv local 1.9.3-p448 

創建一個簡單的文件中設置,check

#!/usr/bin/env ruby 
puts RUBY_VERSION 

使其可執行

$ chmod +x check 

運行它

$ ./check 

輸出

1.9.3 

也就是說,這不是每個文件設置。如果有一種方法可以用shebang來改變rbenv的行爲,那可能會更合適。

+0

是的,但同意你的答案到目前爲解決方案的'1/2'。另一半是寫一個啓動器,使用這個,或更好的路徑紅寶石,然後啓動目標腳本與適當的紅寶石 –

+0

CD'DIN可能允許本地調用'ruby'來拾取'。 rbenv-version'文件。 –

+0

.ruby-version(不是.rbenv-version)與您的工作目錄無關,它基於腳本所在的目錄。 如果將每個腳本與.ruby版本配對,那麼您將精細。否則,您可能必須鏈接到Casper建議的特定版本的Ruby。你不能做其他事情,並可以攜帶,因爲shebang不能保證採取多個選項(http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang-即) –