对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx

上传人:b****8 文档编号:30387966 上传时间:2023-08-14 格式:DOCX 页数:17 大小:24.88KB
下载 相关 举报
对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx_第1页
第1页 / 共17页
对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx_第2页
第2页 / 共17页
对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx_第3页
第3页 / 共17页
对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx_第4页
第4页 / 共17页
对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx

《对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx》由会员分享,可在线阅读,更多相关《对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx(17页珍藏版)》请在冰豆网上搜索。

对话 UNIX第 14 部分 使用 RVM 管理 Ruby 和 gem.docx

对话UNIX第14部分使用RVM管理Ruby和gem

了解RubyVersionManager

需要重新创建另一个Ruby编码人员的开发环境?

希望体验最新版本的JRuby?

想要将您的工作隔离到一组特定的gem中?

有了方便且聪明的RubyVersionManager,您可以完成所有这些以及更多的工作。

尽管InternetRelayChat、论坛和版本控制工具(如Git和Github)令分布式开发变得十分简单,但是重建另一个开发人员的环境将会十分困难。

在一个新的开发机器上支持现有代码体,需要至少匹配初始编码人员的部分(也有可能是全部)堆栈,或是匹配增强应用程序所必需的软件组件。

堆栈可能要求使用某种操作系统(比如UNIX®、Linux®、MacOS或Windows®);特定的操作系统版本(Ubuntu10或11?

MacOSX10.6SnowLeopard或10.7Lion?

);内置和辅助的系统库与标头文件的最小集合;守护程序(daemon)和服务(MySQL或PostgreSQL?

)的配套设施;当然,还包括各种特定于语言的资源,包括从编译器到特定补丁级别的配套开源代码。

在最坏情况下,一些代码被锁定,或依赖每层堆栈的特定修改,甚至可能依赖特定的硬件。

更理想的情况下,堆栈中的标准和抽象也会简化可移植性。

可移植的操作系统接口(POSIX)合规性就是一种有用的标准:

这样,支持POSIX标准的各种系统将提供相同的软件接口并生成相同的结果。

Ruby之类的解释型语言能够支持抽象,因为不需要进行编译,代码可以(可以想象)在任何具备解释器的平台上运行。

也就是说,即使是使用Perl、PHP和Ruby等解释型语言编写的应用程序代码,都要求在一定程度上适应新的机器。

事实上,Ruby通常要求进行相当的设置工作,很大程度上是因为Ruby在持续不断地快速演进,并被推向更多变化的计算环境中。

那就是说,在撰写本文之际,该语言有两个流行版本在供使用,至少5种Ruby解释器基于三种不同的计算机语言,而每个解释器又有几个不同的版本,更不要说还存在成千上万种第三方库:

∙Ruby版本1.8仍然在使用中,而Ruby版本1.9在最近的编码工作中更受青睐。

∙Ruby解释器包括Matz的RubyInterpreter(MRI:

采用 C 编写,以Ruby的创建者命名,即日本计算机科学家Yukihiro Matz Matsumoto);JRuby(采用Java™语言编写,由JavaVirtualMachine[JVM]驱动);Rubinius(采用Ruby编写,在 C++ 字节码虚拟机[VM]顶上运行);RubyEnterpriseEdition([REE]Ruby代码的一个分支并进行了增强,可以提升性能并降低内存消耗);以及MagLev(一种快速且稳定的64位Ruby实现,基于VMware的GemStone/S3.1VM)(参见 参考资料 中的链接)。

所有解释器都是开源的。

每个解释器都有自己的优点,具体要使用哪种解决方案取决于应用程序和开发人员的偏好。

∙根据RubyGems.org(已提供的Ruby代码的官方库),目前共有41780个gem实例可用。

并不是所有Ruby解释器都可以互相替代,这令情况变得更复杂。

虽然不同实现之间发生的大部分代码迁移不会出现问题,但是不能保证(在所有情况下)某个解释器会产生与另一个解释器相同的结果。

考虑到如此多的种类以及对结果进行比较的需要,Ruby开发人员需要迅速访问多个堆栈(正如使用 C 语言进行编码的开发人员一样),但是维护不同的Ruby开发环境可不像在计算机上使用两个不同 C 编译器那么简单。

Shell环境变量(包括PATH、GEM_PATH和GEM_HOME)有助于将环境分离开来,但是要在两个堆栈之间实现一致、清晰、正确的划分,需要进行大量的工作并遵循严格的纪律。

如今,Ruby开发人员拥有了一个近乎 神奇的 替代选择:

RubyVersionManager(RVM),它的创建者是WayneE.Seguin(参见 参考资料 中的链接)。

RubyVersionManager简介

RVM提供了一些重要的特性:

∙RVM目前可构建超过35种实现。

通过一条命令就可以下载、构建和安装任意Ruby解释器。

∙它创建和管理任意数量的Ruby环境,其中每个环境提供单独的Ruby解释器。

因此,一个项目可以使用JRuby,而在同一台计算机上开发的另一个项目则可以指定最新的MRI。

∙此外,每个环境可以拥有任意数量的分散gem集合。

RVM将每个集合适当地称为 gemset。

您可以有一个与JRuby关联的名为auto_parts_store 的gemset,以及一个与MRI版本1.9.3关联的名为 auto_parts_store 的完全不同的gemset。

每个gemset在解释器上下文中必须使用一个惟一名称。

∙解释器与gemset的结合(提供运行Ruby代码和库代码主体的引擎)可通过 interpreter@gemset 符号轻松引用,其中,interpreter 是一个已知解释器的名称,而 gemset 是现有gemset的名称。

例如,1.8.7p302@acme 指的是面向该语言的1.8.7版本的RubyMRI补丁级别302,以及面向Acme网站的gem集合。

gemset可以使用任意名称。

各个解释器的名称由RVM提供。

∙在不同环境之间切换非常简单。

您需要键入以下命令:

rvm interpreter@gemset。

∙通常,在您的主目录中,每个环境都是自包含的和筒仓式(siloed)的。

事实上,整个RVM系统都位于您的主目录中,确保另一个用户无法强制改写或破坏您已经集合的内容,类似地,您也无法破坏其他用户已经集合的内容。

(您也可以集中安装RVM,但是这种做法不太常见)。

∙您可以对其中一个、一些或所有环境运行应用程序的测试套件。

在本地运行MRI,但是在服务器上使用REE。

使用RVM对两者测试代码,然后再正式使用这些修改。

RVM允许您快速试用代码组合,从而可以保持应用程序的稳定和与时俱进。

如果发布了一个新的MRI,您可以在RVM中构建它,创建一个新的环境,运行测试,如果一切顺利的话就可以使用这个新的MRI了。

回页首

入门

RVM的安装非常简单。

只需要使用一条命令并对您的shell启动脚本稍作更改即可。

然而,RVM需要满足一些先决条件。

在继续之前,请检查您的系统,并确保已经在本地安装了 bash、git、tar、curl、gunzip 和 bunzip2实用程序。

此外,您的系统必须具备 Readline、IConv、zLib、OpenSSL 和 Autoconf 包来构建Ruby解释器。

您必须用Bashshell来安装RVM,但是可以在安装RVM后将其用于Zsehll版本4.3.5或更高版本。

自动更新RVM时需要使用 git,稍后将介绍这一内容。

如果您的系统缺少上述列出的所有包,您可以通过一个包管理器快速安装,如对各种Linux发行版使用AdvancedPackagingTool,或对MacOSX使用 brew。

您还必须具备GNU C 编译器来构建应用程序。

准备好系统后,转到一个shell提示符并输入(或复制并粘贴)以下命令:

$bash<<(curl

注意:

两个小于号(<)之间有一个空格。

特殊的Bash语法 <(...) 运行圆括号中的命令并将输出保存到一个临时文件中。

第一个 < 是典型的输入重定向。

因此,该命令运行 bash,并从由 curl 创建的临时文件中提供输入。

将序列看作是运行一个shell脚本,尽管它存储在一个远程服务器中。

准备好系统之后,转到一个Shell提示符并输入(或复制并粘贴)命令。

$curl-L https:

//get.rvm.io |bash -sstable

该命令使用 git 在您的主目录中克隆并创建一个本地RVM实例。

查看$HOME/.rvm下的bin子目录本身包含 rvm 实用程序,而rubies是Ruby解释器的最终目录。

您会发现RVM将根据解释器的类型、版本和gemset将累积的软件组织到一个可预测的层次结构中。

完成脚本安装后,您必须编辑shell的dot或启动文件,以便在新shell启动时能够加载RVMshell函数。

通常情况下,该行为:

[[-s"$HOME/.rvm/scripts/rvm"]]&&source"$HOME/.rvm/scripts/rvm"

必须是.文件的最后一行。

如果使用 bash,将该行代码附加到$HOME/.bashrc文件的末尾。

要使更改生效,必须启动一个新shell或输入source$HOME/.bashrc 重新加载文件。

回页首

选择任意Ruby版本

现在,RVM已安装完毕,接下来要下载、构建和安装一个或多个Ruby解释器。

有许多Ruby版本可用:

计数语言版本、补丁级别,以及基础实现。

您可以使用 rvmlistknown 命令列出所有已知的版本,如 清单1 所示。

清单1.列出所有已知的Ruby解释器版本

$rvmlistknown

#MRIRubies

[ruby-]1.8.6[-p420]

[ruby-]1.8.6-head

[ruby-]1.8.7[-p352]

[ruby-]1.8.7-head

[ruby-]1.9.1-p378

[ruby-]1.9.1[-p431]

[ruby-]1.9.1-head

[ruby-]1.9.2-p180

[ruby-]1.9.2[-p290]

[ruby-]1.9.2-head

[ruby-]1.9.3-preview1

[ruby-]1.9.3-rc1

[ruby-]1.9.3[-p0]

[ruby-]1.9.3-head

ruby-head

#GoRuby

goruby

#JRuby

jruby-1.2.0

jruby-1.3.1

jruby-1.4.0

jruby-1.6.1

jruby-1.6.2

jruby-1.6.3

jruby-1.6.4

jruby[-1.6.5]

jruby-head

#Rubinius

rbx-1.0.1

rbx-1.1.1

rbx-1.2.3

rbx-1.2.4

rbx[-head]

rbx-2.0.0pre

#RubyEnterpriseEdition

ree-1.8.6

ree[-1.8.7][-2011.03]

ree-1.8.6-head

ree-1.8.7-head

#Kiji

kiji

#MagLev

maglev[-head]

maglev-1.0.0

#MacOSXSnowLeopardOnly

macruby[-0.10]

macruby-nightly

macruby-head

#IronRuby--Notimplementedyet.

ironruby-0.9.3

ironruby-1.0-rc2

ironruby-head

针对Ruby1.8.7的补丁级别352MRI为Ruby和Rails的开发提供了良好的基础。

让我们首先安装该补丁。

输入 rvminstall 和引擎名称 ruby-1.8.7-p352。

您也可以输入 rvminstall1.8.7。

在方括号([])中出现的部分解释器名称是可选的,因此 rvminstall1.8.7 与 rvminstallruby-1.8.7-p352 是一样的。

通常,如果只指定了一个版本,RVM将安装该版本的最新代码。

安装好解释器后,RVM将为您下载并构建代码。

清单2 显示了代码。

清单2.构建解释器

$rvminstall1.8.7

InstallingRubyfromsourceto:

/Users/strike/.rvm/rubies/ruby-1.8.7-p352,this

maytakeawhiledependingonyourcpu(s)...

ruby-1.8.7-p352-#fetching

ruby-1.8.7-p352-#downloadingruby-1.8.7-p352,

thismaytakeawhiledependingonyourconnection...

ruby-1.8.7-p352-#extractingruby-1.8.7-p352to/Users/strike/.rvm/src/ruby-1.8.7-p352

ruby-1.8.7-p352-#extractedto/Users/strike/.rvm/src/ruby-1.8.7-p352

Applyingpatch'stdout-rouge-fix'

locatedat/Users/strike/.rvm/patches/ruby/1.8.7/stdout-rouge-fix.patch)

ruby-1.8.7-p352-#configuring

ruby-1.8.7-p352-#compiling

ruby-1.8.7-p352-#installing

Retrievingrubygems-1.8.10

Extractingrubygems-1.8.10...

RemovingoldRubygemsfiles...

Installingrubygems-1.8.10forruby-1.8.7-p352...

Installationofrubygemscompletedsuccessfully.

ruby-1.8.7-p352-adjusting#shebangsfor(gemirberbrirdoctestrbrake).

ruby-1.8.7-p352-#importingdefaultgemsets(/Users/strike/.rvm/gemsets/)

Installofruby-1.8.7-p352-#complete

要切换到刚刚安装的1.8.7解释器,输入 rvm1.8.7。

要列出当前环境的具体内容,输入 rvminfo。

清单3 显示了代码。

清单3.切换到1.8.7解释器

$rvm1.8.7

$rvminfo

rvm:

version:

"rvm1.10.0-prebyWayneE.Seguin

(wayneeseguin@)[

ruby:

interpreter:

"ruby"

version:

"1.8.7"

date:

"2011-06-30"

platform:

"i686-darwin11.2.0"

patchlevel:

"2011-06-30patchlevel352"

full_version:

"ruby1.8.7(2011-06-30patchlevel352)[i686-darwin11.2.0]"

homes:

gem:

"/Users/strike/.rvm/gems/ruby-1.8.7-p352"

ruby:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352"

binaries:

ruby:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352/bin/ruby"

irb:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352/bin/irb"

gem:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352/bin/gem"

rake:

"/Users/strike/.rvm/gems/ruby-1.8.7-p352/bin/rake"

environment:

PATH:

"/Users/strike/.rvm/gems/ruby-1.8.7-p352/bin:

/Users/strike/.rvm/gems/ruby-1.8.7-p352@global/bin:

/Users/strike/.rvm/rubies/ruby-1.8.7-p352/bin:

/Users/strike/.rvm/bin:

/Users/strike/.gem/ruby/1.8.7/bin:

/Users/strike/.ruby_versions/ruby-1.8.7-p174/bin:

/Users/strike/bin/rds:

/usr/local/bin:

/usr/bin:

/bin:

/usr/sbin:

/sbin:

/usr/X11/bin"

GEM_HOME:

"/Users/strike/.rvm/gems/ruby-1.8.7-p352"

GEM_PATH:

"/Users/strike/.rvm/gems/ruby-1.8.7-p352:

/Users/strike/.rvm/gems/ruby-1.8.7-p352@global"

MY_RUBY_HOME:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352"

IRBRC:

"/Users/strike/.rvm/rubies/ruby-1.8.7-p352/.irbrc"

RUBYOPT:

""

gemset:

""

最重要的信息位于 interpreter、version、patchlevel 和 gemset 行,这些信息分别反映了解释器的类型、语言版本、修改,以及当前的gemset。

如果切换到一个新的环境,例如,切换到 ree@auto_parts_store,这些代码行也将发生相应的变化。

事实上,所显示的大多数信息都将在每次切换环境时发生变化。

此外,RVM将自动修改shell设置和变量,为每个RVM环境创建一个岛(island)。

注意,PATH已经更改为指向新的Ruby。

输入 whichruby 进行确认。

$whichruby

/Users/strike/.rvm/rubies/ruby-1.8.7-p352/bin/ruby

可以看到,路径中的第一个可执行的Ruby就是刚刚安装的那个。

要安装不同的Ruby解释器,再次运行 rvminstall 来指定一个不同的名称。

在任何时间输入 rvmlist 都可以发现您在本地安装的ruby。

$rvmlist

jruby-1.6.4[x86_64]

ree-1.8.7-2009.10[i686]

ree-1.8.7-2010.02[i686]

ruby-1.8.7-p334[i686]

=>ruby-1.8.7-p352[i686]

ruby-1.9.2-p0[x86_64]

ruby-1.9.2-p290[x86_64]

输出中的箭头表示当前正在使用的Ruby解释器。

类似地,如果希望了解当前环境中定义的所有gemset的名称,输入 rvmgemsetlist。

同样,其中的箭头同样表示当前使用的gemset。

$rvmgemsetlist

gemsetsforruby-1.8.7-p352(foundin/Users/strike/.rvm/gems/ruby-1.8.7-p352)

brewster

canvas-src

global

=>miner

moms

tech

在这些gemset中,名为 global 的gemset比较特殊。

正如WayneSeguin所解释的,“RVM为每个Ruby解释器提供了一个 global gemset。

针对给定Ruby安装到 global gemset的gem可用于所有其他与该Ruby相关的gemset。

这种方法允许所有项目针对特定Ruby解释器安装共享相同的gem”。

让我们看看如何创建、删除、扩展并切换到不同的gemset。

回页首

管理gemset

RVM允许您从一个解释器切换到另一个解释器。

您现在可以在一个目录中根据Ruby版本1.9.2的特性和语法开发一个新的代码,并在另一个目录中维护较旧的1.8.7的代码库,这两个目录都在同一个计算机中。

您甚至还可以在所选的任意Ruby版本中运行单一代码库。

下一步是使用独立的gemset管理项目的库依赖关系。

为了对此进行演示,假设目录web-1.8.7包含一个基于Rails3.1和Ruby1.8.7的Rails应用程序,而目录daemon-1.9.2是一个使用Ruby编写的系统守护程序,基于版本1.9.2(您不需要将版本号放到目录名中;这里使用了显式命名来最小化混淆)。

为每个代码库提供各自的gemset,看看如何填充每个代码库。

要切换到1.8.7,输入 rvm1.8.7。

输入 rvmgemsetcreateweb 以创建一个名为 Web 的新gemset,如 清单4 所示。

清单4.创建并选择一个gemset

$cdweb-1.8.7

$rvm1.8.7

$rvmgemsetcreateweb

$rvmgemsetlist

brewster

canvas-src

global

=>miner

moms

tech

web

$rvmgemsetuseweb

$rvmgemsetlist

brewster

canvas-src

global

miner

moms

tech

web

=>web

$rvminfo

ruby:

interpreter:

"ruby"

version:

"1.8.7"

...

patchlevel:

"2011-06-30patchlevel352"

...

gemset:

"web"

rvmgemsetcreate 将制造一个新的gemset,但是不会将它变为最新的、活动的gemset。

使用 rvmgemsetuse 切换到一个特定的gemset。

您可以使用 rvminfo 命令在任何时间检查或确认自己的状态。

新的gemset激活后,有关gem安装的任何命令都将只影响该gemset。

例如,最常见的 geminstall 命令将添加一个gem列表。

当gemset激活后,gem将不会安装到系统gem缓存中,而是安装到gemset自己的缓存中,如

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1