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)。但是,许多 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
是什么赋予了?这是 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
ruby.exe
不引用你曾经使用过的gem install
这个 gem的想法是什么?我只是做错了吗?我应该需要一个系统 Ruby,然后使用 Bundler 或其他东西来隔离它吗?