gpt4 book ai didi

ruby - RubyGems 创建的 gem 批处理文件是错误的还是我遗漏了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:06 24 4
gpt4 key购买 nike

Ruby 安装中有一些批处理文件引用了 this 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" %*

但是,一些 gems 会得到一个引用 system 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)。但是,许多 gem(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

什么给了?这是 ruby​​gems creates 方式的缺陷吗?批处理文件?

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 生成的批处理文件。

此 stub 将 %~dp0 视为 Ruby 可执行文件所在的位置,相对于此批处理文件,因为我们知道这些批处理文件将与可执行文件一起出现。

Gems 可以安装在任何地方,而不仅仅是在 Ruby 的树中(例如通过使用 Bundler 或 gem install --install-dir--bindir)。

在那些情况下,RubyGems 批处理文件不能使用 %~dp0 来确定 Ruby,这就是为什么这些批处理文件 stub ruby.exe在其中。

正如您指出的那样,问题是 ruby.exe 将从 PATH 中找到,它包含您的全局 Ruby 安装,而不是您正在使用的独立安装上。

一个快速修复方法是在 PATH 前面加上这个独立的 Ruby 的目录:

SET PATH=C:\<some-other-path>\Ruby\bin;%PATH%

您可以将其放入像 setenv.bat 这样的批处理文件中,在执行 Ruby 之前调整环境(或作为启动脚本)。

另一种选择是使用类似 gem-exefy 的东西,它将替换可执行 stub 的批处理文件,并将使用与其相关的 Ruby dll,因此将使用独立版本而不是全局版本。

对于家庭作业,我不确定 bundle exec 是否会工作,因为它会使用 PATH 来查找要运行的可执行文件,所以无法详细告诉您.

希望这可以解释为什么 RubyGems 生成的批处理文件与 RubyInstaller 生成的批处理文件不同。

关于ruby - RubyGems 创建的 gem 批处理文件是错误的还是我遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com