繁体   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