[英]Is RubyGems creating the gem batch file wrong or am I missing something?
Ruby安裝中有一些批處理文件引用了這個 Ruby exe( $~dp0ruby.exe
)。 例如, gem.bat
(注意最后一行)
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
ECHO.This version of Ruby has not been built with support for Windows 95/98/Me.
GOTO :EOF
:WinNT
@"%~dp0ruby.exe" "%~dpn0" %*
但是,一些gem獲得了一個引用系統 Ruby( ruby.exe
)的批處理文件,無論哪個都在PATH
。 例如, bundle.bat
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe" "C:/Ruby192/bin/bundle" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe" "%~dpn0" %*
我有一個用於.NET項目的獨立Ruby環境(開發人員或構建代理不太可能擁有系統Ruby)。 但是,許多寶石(bundler,rake等)都試圖在一個不存在的系統Ruby中執行。
C:\
Ruby192\ <-- System Ruby, would be here
bin\ and this bin would be in the
bundle.bat PATH
gem.bat
ruby.exe
<some-other-path>\ <-- An isolated environment, in
Ruby\ my problem, this is deployed
bin\ to a build agent
bundle.bat
gem.bat
ruby.exe
是什么賦予了? 這是rubygems 創建批處理文件的方式的缺陷嗎?
def windows_stub_script(bindir, bin_file_name)
ruby = File.basename(Gem.ruby).chomp('"')
return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"#{ruby}" "%~dpn0" %*
TEXT
end
有什么想法沒有引用你用於gem install
這個gem的ruby.exe
? 我只是做錯了嗎? 我應該需要一個系統Ruby,然后使用Bundler或其他東西來隔離它嗎?
我是RubyInstaller項目的維護者之一,該項目生成了您顯示的第一批文件。
編譯Ruby時,我們用自己的batch_stub
替換Ruby生成的生成的批處理文件
這個存根認為%~dp0
是Ruby的可執行文件相對於這個批處理文件的地方,因為我們知道這些批處理文件將沿着可執行文件。
Gems可以安裝在任何地方,不僅可以安裝在Ruby的樹中(例如使用Bundler或gem install --install-dir
或--bindir
)。
在這些情況下,RubyGems批處理文件不能使用%~dp0
來確定Ruby,這就是為什么這些批處理文件存根中只包含ruby.exe
的原因。
正如您所指出的,問題是可以從PATH
找到ruby.exe
,它包含您的全局Ruby安裝,而不是您正在處理的孤立的安裝。
快速修復將在PATH
前面加上這個孤立的Ruby的目錄:
SET PATH=C:\<some-other-path>\Ruby\bin;%PATH%
您可以將它放在像setenv.bat
這樣的批處理文件中,在執行Ruby之前調整環境(或作為啟動腳本)。
另一種選擇是使用類似gem-exefy的東西,它將替換可執行存根的批處理文件,並將使用相對於它找到的Ruby dll,因此將使用隔離版本而不是全局版本。
對於家庭作業,我不確定bundle exec
是否會工作,因為它將使用PATH
來查找要運行的可執行文件,因此無法詳細告訴您。
希望這能解釋為什么RubyGems生成的批處理文件與RubyInstaller生成的批處理文件不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.