簡體   English   中英

RubyGems是否創建了寶石批處理文件錯誤或者我錯過了什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM