Ruby on Rails-rbenv:在没有宝石的情况下生存

TL; DR

  • 不要为宝石而烦恼。 可以同时安装多个版本的gem。
  • 必要时,使用bundle install符号指定要执行的版本。
  • 当您拥有指定版本的Gemfile时,请使用bundle install
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server

更新时间:2015-06-04

我三年前写了这个问题。 部分原因是基于错误的假设,部分情况此后发生了变化。 感谢@indirect最初提供的答案,我想引起大家对@kelvin上面概述的较新(较少支持)的答案的关注。

我的错误假设:一次只能安装一个版本的gem,因此需要gemset隔离命名空间。 不对。 可以同时安装多个版本的gem。 从命令行调用时,将使用最新的版本,除非您有一个Gemfile指定版本约束并通过bundle install调用该命令,或者将版本指定为其第一个参数。

另请参阅如何从命令行调用gem的旧版本? 回复:下划线版本表示法。


原始问题:

我有多个项目正在使用不同版本的Rails进行。 我有一个工作流(如下所述),用于使用特定版本的rails创建项目,并使项目彼此隔离。 我想尝试其他工作流程,特别是使用rbenv而不是RVM,但是目前尚不清楚该如何做。

问题:当使用rbenv和bundler而不是rbenv-gemset或rvm时,创建多个使用不同版本的rails的rails项目的最佳最佳实践是什么?

用例:我有两个Rails项目,分别是ProjectA和ProjectB。 ProjectA是使用一种版本的Rails(“ RailsA”)开发的,而ProjectB使用另一种版本的Rails(“ RailsB”)。 如何管理同时安装两个版本?

GEMSETS方法:刚开始进行Rails开发时,我使用RVM。 除了支持多个并发安装的ruby,RVM还支持具有多个命名宝石集。 每个项目都有自己独立的宝石收藏(包括rails本身),称为宝石集:

rvm gemset create RailsA
rvm gemset use RailsA
# RailsA.  Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install

注意:应该通过bundle install命令使用所需版本的rails完成项目文件夹的创建(IMHO),因为框架文件会在版本之间变化。 (也许我应该重新考虑这个前提?)

捆绑程序方法:我一直在使用rbenv而不是RVM,但是我对工作流程的理解并不清晰。 山姆·斯蒂芬森(Sam Stephenson)在README.md中写道:“ rbenv不……管理gemset。Bundler是管理应用程序依赖项的更好方法。” 有一个插件(rbenv-gemset)可以得到与rvm的gemset相同的结果,但是Sam显然更喜欢使用Bundler。 不幸的是,他没有详细说明工作流程的样子。 甚至Bundler网站也没有明确地将如何将一个项目与另一个项目隔离开来。 一些博客和要点进行了救援,建议使用以下bundle install文件:

---
BUNDLE_PATH: vendor/bundle

(顺便说一句,我不确定“ ---”是什么意思。文档中没有提及它,而且似乎也没有什么区别。)

这有效地为每个rails项目提供了自己的宝石集,将宝石存储在ProjectX / vendor / bundle /中。 实际上,一旦运行bundle install,便会将Rails本身(重新)安装在这里,从而使该项目完全独立于我的环境。

但是房间里的大象是首先创建rails项目文件夹的鸡和蛋的问题!! 为了使用RailsA创建ProjectA文件夹,我需要首先安装rails(及其众多依赖项)。 但是,当我要创建ProjectB时,必须切换到使用RailsB。 没有宝石集,我必须进行一些认真的升级/降级。 不酷

一个可能的解决方案就是不用担心我用来创建ProjectX文件夹的rails版本。 如果随后使用Rails 3.0创建3.2项目,则可以手动创建应用程序/资产树。 但是,这让我很生气。 有没有更好的办法?

3个解决方案
42 votes

大多数人可以通过2989982734979979957760首先安装Rails gem来解决此问题。如果由于某种原因拒绝这样做,则可以选择退出Rails尝试为您做的自动捆绑。 无论您使用红宝石管理系统如何,这将完全起作用。

mkdir myapp
cd myapp
echo "source :rubygems" > Gemfile
echo "gem 'rails', '3.2.2'" >> Gemfile
bundle install --path vendor/bundle
bundle exec rails new . --skip-bundle

出现提示时,键入“ y”以将Gemfile替换为默认的Rails 1(或根据您的喜好选择不替换)。 然后,一旦完成:

bundle install

完成后,您无需选择将rails gem安装到rubygems中,即可使用您选择的版本增强一个新的rails应用程序。

indirect answered 2020-07-31T00:16:12Z
12 votes

假设您已经安装了rails 3.1.0,但是您想使用未安装的rails 3.2.13创建一个新项目。

假设您希望新项目在~/projects/Project2中。

gem install rails -v 3.2.13
cd ~/projects
rails _3.2.13_ new Project2

这将为您创建.ruby-version,并将其锁定为您在命令行上指定的rails版本。

我特意省略了为新项目保留单独的宝石副本的想法,因为这与Bundler的理念背道而驰,Bundler的理念是将所有宝石都安装在一个地方。 当您运行滑轨时,Bundler将从该中心位置自动选择正确的gem版本。 这意味着一个项目可以共享gem,而不是为其本身安装一个新的副本。 (但是请注意,您安装的每个版本的ruby都有自己的gem。这是一件好事,因为本机扩展可能无法在所有ruby版本中使用。)

您确实需要多一点注意,因为大多数命令(例如.ruby-version)将加载已安装的bundle install的最新版本。 您需要运行bundle install以确保加载了正确的版本。 通常,我将为bundle check以外的所有命令运行rails new --skip-bundle。您可以创建一个别名使其更短(我使用bex)。 要使用gem可执行文件自动执行此操作,可以使用rbenv-binstubs,但您仍然必须注意,运行诸如ruby和298998183105711414119之类的非gem可执行文件不会自动使用Gemfile。

旁注:.ruby-version将运行bundle install,它将检查依赖项的最新版本。 如果您希望捆绑程序尝试使用满足依赖要求的当前安装的gem,则可以跳过bundle installrails new --skip-bundle,然后在应用程序目录中运行bundle check

旁注2:假设您要为Project2使用红宝石版本(例如2.1.8),该版本与默认版本(例如2.3.0)不同。 在这种情况下,运行上面指定的.ruby-version将在2.3.0下安装gem,这是浪费时间,因为您需要在2.1.8下再次安装gem。 要解决该问题,您可以通过环境变量强制命令使用首选版本:

RBENV_VERSION=2.1.8  gem install rails -v 3.2.13
cd ~/projects
RBENV_VERSION=2.1.8  rails _3.2.13_ new Project2
echo 2.1.8 > Project2/.ruby-version

您可以使用.ruby-version设置变量,但是我只建议您,如果您不希望rbenv在该Shell期间基于.ruby-version文件自动切换。 很容易忘记设置了变量,而当您将CD切换到另一个项目时,它将不会使用您期望的版本。

Kelvin answered 2020-07-31T00:15:43Z
8 votes

最近有一篇关于gemsets / bundler主题的好文章[http://rakeroutes.com/blog/how-to-use-bundler-instead-of-rvm-gemsets/]可以应用到rbenv的良好背景 建立。

Max answered 2020-07-31T00:16:32Z
translate from https://stackoverflow.com:/questions/9771172/rbenv-surviving-without-gemsets