Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Bundler-在同一个文件中有多个Ruby版本_Ruby_Rubygems_Bundler - Fatal编程技术网

Ruby Bundler-在同一个文件中有多个Ruby版本

Ruby Bundler-在同一个文件中有多个Ruby版本,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,我正在macos上使用rbenv和bundler 我需要为我的应用程序维护多个版本的Ruby。特别是2.2.4和2.5.5。不同的用户将有不同的版本 目前我只使用2.2.4,所以我做了以下工作。我的gemfile如下所示 source "https://rubygems.org" ruby '2.2.4' gem "net-ssh", "4.1.0" gem "net-scp", "2.0.0"

我正在macos上使用
rbenv
bundler

我需要为我的应用程序维护多个版本的Ruby。特别是2.2.4和2.5.5。不同的用户将有不同的版本

目前我只使用2.2.4,所以我做了以下工作。我的
gemfile
如下所示

source "https://rubygems.org"
ruby '2.2.4'

gem "net-ssh", "4.1.0"
gem "net-scp", "2.0.0"
.....
要安装,我运行
bundle install
,然后使用我运行的应用程序进行部署

bundle install --deployment --path src/mct-tools/ext/gems
这将在我的应用程序中生成一个文件夹
src/mct tools/ext/gems/ruby/2.2.0
,然后分发

现在我想添加带有更新gems的ruby 2.5.5,所以我想知道这样一个gems文件是否可以接受

source "https://rubygems.org"
ruby '2.2.4'

gem "net-ssh", "4.1.0"
gem "net-scp", "2.0.0"
.....

ruby '2.5.5'

gem "net-ssh", "6.1.0"
gem "net-scp", "3.0.0"
.....
因此,当我使用
bundle install--deployment--path src/mct tools/ext/gems
进行部署时,这两个版本将添加到gems文件夹中

这是正确的方法吗?另一种方法是为每个版本指定两个不同的gemfiles,然后在它们之间切换。

gemfiles声明依赖项 Gemfile声明了对Ruby版本的依赖,无论有无约束。它并不意味着控制应用程序的多个构建目标。它只是强制要求应用程序/gem可用的Ruby版本是您定义的任何版本。例如:

# Will fail if run with a different RUBY_VERSION.
ruby '2.2.4'

# Allows RUBY_VERSION >= 2.2.4, but <= 2.3.
ruby '~> 2.2.4'

# Allows either Ruby 2.2.4+ or 2.5.5+, with
# a minimum (but no maximum) patch version.
ruby '~> 2.2.4', '~> 2.5.5'
交换文件

如果你坚持按照你所做的方式,在GEMFILE中允许使用一个奇异的Ruby版本,那么你可以考虑在源树中有两个不同名称的GEMFILE文件,比如GEMFIE-2.2.4和GEMFIE-2.5.5。然后,您可以指定要与哪个Gemfile一起使用,或者通过将自定义Gemfile符号链接到项目的规范

Gemfile

以下是一些需要考虑的例子:

#针对具有
#硬编码的Ruby版本。
$ls文件*
Gemfile-2.2.4 Gemfile-2.5.5
$bundle安装--gemfile=“gemfile-2.2.4”
#针对任何自定义文件进行解析
#符号链接到您的文件。
$ln-sf文件{-2.5.5,}
$ls-F文件*
Gemfile@Gemfile-2.2.4 Gemfile-2.5.5
$bundle安装
这两种方法都可以工作,但前者更灵活,每次都需要指定所选的Gemfile,而后者可以在开发/测试工作流不支持Bundler的
--Gemfile
标志时提供帮助

用Ruby管理器更换Ruby 如果开发中有多个Ruby版本,最佳实践是使用版本管理器,如rvm、rbenv或chruby。您可以使用版本管理器根据需要手动来回更改rubies

您还可以检查您的版本管理器是否支持自动打开
.ruby version
或其他配置文件。每次您想针对不同的Ruby进行构建或测试时,仍然需要更新该文件,但您不必不断更改Gemfile内容、重新指向Gemfile符号链接或在每次调用Bundler时更新标志


任何给定的方法是否优于其他方法将取决于您的工作流。没有任何技术解决方案适合所有情况,因此您的里程数可能会有合理的变化。

如果这听起来很可笑,我很抱歉,但是。。。为什么?您应该期望应用程序的用户安装定义良好的依赖项列表。如果一个客户端的应用程序的旧版本在很长一段时间内没有更新,那么这很烦人,但很好-他们可以在稍后的日期赶上并安装所有新的依赖项。尝试同时支持一种语言的多个版本,以及所有其他依赖项,会让你走上疯狂的道路理论上你是对的。然而,我正在使用Ruby为不同的软件编写插件(如果您好奇的话,可以使用SketchUp)。不同版本的SketchUp支持不同版本的Ruby。一些客户不想更新他们的软件,因为它是昂贵的或其他一些原因。最新版本的Ruby在以前版本的软件中根本不起作用。如果我想支持它们,我需要处理不同的版本。@TomLord我希望在某个时候每个人都会更新,这样我就可以摆脱旧版本。您应该针对多个版本进行测试,但您的用例反对在源代码树中将硬编码的Ruby版本指定为依赖项。我在下面提供了一个更广泛的解释和几个不同的选择。谢谢你的解释。我想我会尝试使用多个文件。
language: ruby
rvm:
  - 2.2.4
  - 2.5.5