【问题标题】:Ruby On Rails 3.2.13 - Using Different Gemsets For Rails ApplicationsRuby On Rails 3.2.13 - 为 Rails 应用程序使用不同的 Gemset
【发布时间】:2013-06-11 17:55:05
【问题描述】:

我目前有几个运行 3.2.13 版且使用 Ruby 1.9.3 的 Rails 应用程序。我计划最终将我当前的应用程序升级到 Rails 4.0,然后将 Ruby 升级到 2.0。我需要仔细考虑转换到 Ruby 2.0 的时间,因为据我了解,Phusion Passenger 只会处理一个版本的 Ruby,而不会出现一些我目前不打算尝试实施的解决方案。

我目前为我的所有 Rails 应用程序使用一个 gemset。我想在某个时候将我的 Rails 应用程序从 3.2.13 一个一个转换为当前版本的 Rails 4.0。当我尝试将我的一个应用程序更新到较新版本的 Rails 时,我被告知我必须执行更新 rails 命令。

我想要做的是能够运行我的一些应用程序使用 Rails 3.2.13 和其他使用 Rails 4.0,直到我确定它们都可以在 Rails 4.0 下正常运行。完成此操作后,我将查看 Ruby 1.9.3(如果有的话)之间的差异,并将它们全部升级为使用 Rails 2.0。在这一点上,我知道我只会为 2.0.0 或任何 Ruby 2 的最新稳定版本创建 gemset。

我已经完成了网络搜索并查看了 RVM 网站。我了解如何将 gemset 分配给您要运行的 Ruby 版本。但是,我没有看到任何关于在相同版本的 Ruby 上使用 gemset,而是在同一台机器上为不同的应用程序使用不同版本的 Rails 或其他 gem 组合。这个可以吗?

任何帮助将不胜感激。

【问题讨论】:

  • RVM guides 在第一个示例中准确解释了您所说的内容。
  • 这解释了如何为不同版本的 Rails 创建不同的 gemset,但没有解释如何确定每个应用程序使用哪个 gemset。也许我错过了什么。

标签: ruby-on-rails ruby rvm gemset


【解决方案1】:

仔细看看! ;)

首先,创建一个名称与您的项目相对应的新 gemset https://rvm.io/gemsets/creating/ 例如:rvm gemset create project_name

然后在项目目录下创建/编辑.rvmrc文件:rvm use 1.9.3@project_name

一个陷阱是,如果你执行以下命令

cd some_project
cd ../other_project

并且 other_project 没有指定 gemset,您将留在 some_project gemset 中。为避免这种情况,您可以在“项目”目录中创建带有默认 gemset 的 .rvmrc 文件(如果有的话)

【讨论】:

  • 我目前没有在我的项目中使用 .rvmrc。这可以解释我刚刚发现的其他东西。我的尝试是为我的所有 Rails 应用程序使用一个 gemset,但在列出 gemset 之后,我发现我无意中创建了其他的 gemset。看来我的宝石已经失控了。我可以在这里尝试另一种选择。
  • 你也可以看看rbenv。我个人有完全不同的方法,因为我所有的应用程序都是 Ruby 1.9.3。我告诉 bundler 在 project_dir/.gems 中安装 gems,所以对于每个项目,我默认都有 gem 分离。请参阅github.com/hajder/bootstrap-ruby-on-your-mac,但它并不完整
【解决方案2】:
Project Folder
|___Gemfile
|__.ruby-gemset
|__.ruby-version

 Gemfile with all the required gems mention in your project folder
.ruby-gemset should have gem set name like sample-gemset
.ruby-version file should have specific ruby version (e.g 2.0)

 rvm gemset list

它将显示使用 sample-gemset 创建的 gem 集并执行

捆绑安装

它将在 sample-gemset 下安装此项目的所有特定 gem, 您可以为其他项目创建其他 gem 集,这样您可以使用 rvm 为不同的项目维护不同的 rails/gems 和 ruby​​ 版本。

【讨论】:

    【解决方案3】:

    您的 Gemfile.lock 确定了您使用的每个 gem 的版本 - 您无需担心 gemset。

    bundle install 将始终安装正确的版本,并且您的应用将始终使用 Gemfile.lock 中的版本,即使有其他版本浮动

    【讨论】:

    • 我更喜欢和你一样只使用 bundler 来管理我的 gem,但这确实意味着在你有多个版本的 gem 浮动的情况下必须使用 bundle exec -- 值得一提。
    • 澄清一下:要更新我的一个应用程序以使用 Rails 4.0,我所要做的就是更改 Gemfile 中的 Rails 版本以及添加 Ruby 版本号,然后执行捆绑包?我想确保这将允许我在不同的应用程序中运行 Rails 3.2.13 和 Rails 4.0。
    • bundle install / bundle update 更新捆绑包中的内容,否则可以。 bundle exec 适用于当您想从 gems 运行可执行文件时(例如 bundle exec rails g migration Foo)
    • bundle exec rails s, bundle exec rake ... 等等。这是因为否则你不会在你的包的上下文中运行可执行文件,所以它会使用你系统中最新的 gem 并抱怨它与您的 Gemfile 不匹配。
    • 非常感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2012-09-11
    • 2011-06-27
    相关资源
    最近更新 更多