## 24.宝石
宝石是红宝石的包装管理材料。 例如,你可能想用红宝石做某事,例如说比较两个哈希,而不是自己编写代码,而是可以搜索位于 [http://rubygems.org](http://rubygems.org) 的 ruby gems 存储库。
### 24.1。 搜索宝石
因此,让我们比较两个哈希。 有一个称为 hash_compare 的 gem,用于比较散列。 现在,你可以转到 [http://rubygems.org](http://rubygems.org) 并搜索“哈希比较”,而无需使用双引号
![gems 1e8f9](https://img.kancloud.cn/76/2e/762e05c882169dba09c28cc7f4d6938a_1351x671.jpg)
你将获得一个如下所示的页面,单击“哈希比较”链接,你将被定向到此页面。 [https://rubygems.org/gems/hash_compare](https://rubygems.org/gems/hash_compare)
![gems 7c3d0](https://img.kancloud.cn/11/4c/114cd697f19ce8768eaac2c712a95925_1351x671.jpg)
这就是你搜索宝石的方式。 相反,如果你搜索确切的宝石名称 hash_compare,则 [http://rubygems.org](http://rubygems.org) 现在变得很聪明,可以直接进入宝石页面。
### 24.2。 安装宝石
现在,你已经找到了 gem,如何安装它? 如果你位于 gems 页面,则在这种情况下, [https://rubygems.org/gems/hash_compare](https://rubygems.org/gems/hash_compare) ,你将获得将其安装到计算机上的说明。 你可以通过键入以下命令来安装 hash_compare gem
```rb
$ gem install hash_compare
```
这将吐出以下内容,表明它已安装
```rb
Fetching: hash_compare-0.0.0.gem (100%)
Successfully installed hash_compare-0.0.0
1 gem installed
Installing ri documentation for hash_compare-0.0.0...
Installing RDoc documentation for hash_compare-0.0.0...
```
也就是说,在终端中键入`gem install gem_name`应该可以毫无问题地安装大多数宝石。
### 24.3。 查看文件
因此,你已经成功安装了 gem,现在你必须知道如何使用它,在其他地方,除了学习其文档之外,还是学习红宝石代码的好地方。 如果不确定 rdoc 或 ruby 文档,请阅读 [Rdoc](#_rdoc) 一章。 要查看已安装的 gem 的文档,你需要启动一个叫做 gem server 的东西,可以通过在终端中键入以下命令来实现
```rb
$ gem server
Server started at http://0.0.0.0:8808
```
上面的命令将显示一个输出,表明服务器已启动。 要了解有关哈希的信息,请在浏览器中将 gem 转到此地址 [http://0.0.0.0:8808](http://0.0.0.0:8808) 并搜索 hash_compare,否则,如果需要更短的方法,请单击此链接 [http:/ /0.0.0.0:8808/#hash_compare](http://0.0.0.0:8808/#hash_compare) ,当你单击 hash_compare 时,你将被引导到此处 [http://0.0.0.0:8808/doc_root/hash_compare-0.0.0/rdoc/index.html [](http://0.0.0.0:8808/doc_root/hash_compare-0.0.0/rdoc/index.html) ,这是 hash_compare gem 的文档页面。
在该页面上,你将具有关于 hash_compare gem 的足够(可能)详细信息。
### 24.4。 使用宝石
OK,要使用宝石 <sup class="footnote">[ [58](#_footnotedef_58 "View footnote.") ]</sup> ,我们在终端中使用以下命令登录到 irb
```rb
$ irb --simple-prompt
```
接下来,我们将需要使用以下命令的哈希比较命令
```rb
>> require 'hash_compare'
=> true
```
由于安装了宝石,因此显示`true`。 现在让我们构建两个哈希 a,如下所示
```rb
>> a = { a: 1, b: 2}
=> {:a=>1, :b=>2}
>> b = { a: 1, b: 3, c: 2}
=> {:a=>1, :b=>3, :c=>2}
```
现在我们将它们添加到 hash_compare 对象
```rb
>> h = HashCompare.new a, b
```
并使用新添加的功能查找新添加的内容,如下所示
```rb
>> h.newly_added
=> {:c=>2}
```
好吧,就是这样。 你已经了解了如何使用宝石。
### 24.5。 宝石文件
你一定听说过 Ruby gems,即将创建它并将其发布在 [http://rubygems.org](http://rubygems.org) 上。 现在让我们看看 Gemfile 的用途。
检出这些文件:
第一个叫做 requester.rb
```rb
# requester.rb
require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)
resource = RestClient::Resource.new 'http://nothing.com'
p resource.get
```
第二个是 Gemfile,具有以下内容
```rb
source 'https://rubygems.org'
gem 'rest-client'
```
将它们放在同一文件夹中。 如果查看 requester.rb,它将使用以下几行将请求发送到 [http://nothing.com](http://nothing.com) :resource = RestClient :: Resource.new'http://nothing.com'
```rb
p resource.get
```
并打印出来。 为此,我们需要使用以下命令安装一个名为 rest-client 的 gem
```rb
$ gem install rest-client
```
我们需要使用以下行将其要求为 requester.rb
```rb
require 'rest-client'
```
换句话说,代码必须如下所示
```rb
require 'rest-client'
resource = RestClient::Resource.new 'http://nothing.com'
p resource.get
```
那么为什么我们有这三行
```rb
require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)
```
而不是一个? 好吧,让我解释一下。 首先,这是一个简单的项目,只需要一颗宝石,实际上,在现实生活中我们可能需要数十个宝石。 在运行项目之前,如果系统中没有这些 gems,则需要手动检查每个 gem 是否存在并安装。 对于少量宝石来说,这可能很简单,但事实是,如果我们有很多宝石,我们会讨厌它。
欢迎使用 Ruby,这是 Gemfile 的救星。 让我们分析一下。 打开 Gemfile,第一行是
```rb
source 'https://rubygems.org'
```
这告诉捆绑程序(获取和安装宝石的东西)必须从何处获取宝石。 几乎所有红宝石宝石都以 [http://rubygems.org](http://rubygems.org) 结尾。 但是有些坏人喜欢拥有专有代码并且不公开发布。 那些吸盘让它们自己保存,对他们来说将有所不同。
接下来,我们逐一列出该格式所需的宝石 gem“ < gem-name >”。 在这种情况下,我们只有一个宝石,因此我们将其列为
```rb
gem 'rest-client'
```
接下来,在需要这些宝石的 ruby 程序中,我们将这段代码放在顶部
```rb
require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)
```
我不知道它到底能做什么,但是这会加载 Gemfile 中指定的所有 gem,从而使我们运行程序所需的所有 gem 都可以使用。 如果将来我能学到更多,可能会更新此部分,或者可能不会更新。 将所有 gem 提取并安装到系统中所需要做的就是在终端中键入以下内容:
```rb
$ bundle install
```
或总之
```rb
$ bundle
```
而已。 最新版本的所有 gems 都将安装在你的系统中,并且可用于需要它的程序 <sup class="footnote">[ [59](#_footnotedef_59 "View footnote.") ]</sup> 。 享受生活!
#### 24.5.1。 Gemfile.lock
如果查看 [Gemfile](code/fetch_data/Gemfile) ,则只给出`gem 'rest-client'`,但请看下面所示的 [Gemfile.lock](code/fetch_data/Gemfile.lock) 。 它包含很多东西。 这是什么 Gemfile.lock。
好吧,它的简单`rest-client`并不是独立的 Ruby 包(又名宝石),它依赖于其他宝石。 Gemfile.lock 列出了我们使用`bundle`命令时安装的所有 gem。 让我们分析如下所示的 Gemfile.lock
```rb
```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
```rb
|
```
GEM
remote: https://rubygems.org/
specs:
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
mime-types (3.2.2)
mime-types-data (~> 3.2015)
mime-types-data (3.2018.0812)
netrc (0.11.0)
rest-client (2.0.2)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.5)
PLATFORMS
ruby
DEPENDENCIES
rest-client
BUNDLED WITH
1.16.2
```rb
|
```
因此,它以关键字`GEM`开头,在该关键字下列出了所有已安装的 gem。 检出第 2 行,它说`remote: [https://rubygems.org/](https://rubygems.org/)`,如果你还记得在 Gemfile 中输入了`source 'https://rubygems.org'`,则会将其记录为锁定文件中的远程存储库。
检出这些行(20 & 21)
```rb
PLATFORMS
ruby
```
在此定义平台。 本书重点介绍的是 YARV <sup class="footnote">[ [60](#_footnotedef_60 "View footnote.") ]</sup> ,它是默认的红宝石解释器,但不是唯一的。 还有其他解释器,例如运行 Java 的 JRuby。 这些信息记录在此`PLATFORM`下。
这些行中也记录了捆绑软件的版本(26 & 27)
```rb
BUNDLED WITH
1.16.2
```
你可以通过在终端中键入以下命令来检查捆绑程序的版本
```rb
$ bundle -v
Bundler version 1.16.2
```
让我们回到`GEM`部分。 在 Gemfile 中,我们只需要 rest-client 即可。 在第 12 行的锁定文件中,我们看到`rest-client (2.0.2)`,即安装了版本 2.0.2 的 rest 客户端,但是在以下几行中,我们也看到了这一点
```rb
rest-client (2.0.2)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
```
这意味着`rest-client`依赖于其他宝石,即`http-cookie`,`mime-types`和`netrc`。 让我们以`http-cookie (>= 1.0.2, < 2.0)`表示,这意味着`2.0.2`版本的`rest-client`依赖于`http-cookie`,其版本必须大于或等于`1.0.2`但小于`2.0`。 如果你想知道如何对 gems 进行版本控制,并且可能想对软件进行正确的版本控制,则可以在 [https://semver.org/](https://semver.org/) 上查看语义版本控制。
现在让我们来看看`http-cookie`,看一下第 6 行和第 7 行,你会看到
```rb
http-cookie (1.0.3)
domain_name (~> 0.5)
```
这意味着已安装版本`1.0.3`的`http-cookie`,并且它取决于等于或大于 0.5 的`domain_name` gem。 如果你对`>`,`>=`和`~>`感到困惑,这就是它们的意思
* =等于“ = 1.0”
* !=不等于“!= 1.0”
* >大于“ > 1.0”
* <小于“ < 1.0”
* > =大于或等于“ > = 1.0”
* ⇐小于或等于“⇐1.0”
* 〜>悲观地大于或等于“〜> 1.0”
因此,接下来你可以跟踪`domain_name (~> 0.5)`所依赖的内容,依此类推。 锁定文件将构建一个依赖关系树,并记录已安装的 gem 的确切版本,因此即使从现在开始捆绑了该软件,它也可以从锁定文件中安装 gem 的确切版本,从而保证了它可以正常工作。 。
### 24.6。 创造宝石
让我们看看如何创建一个非常简单的宝石。 让我们创建一个名为 hello_gem 的宝石,它只祝你好,并欢迎来到 Ruby Gems 的美好世界。 并且仅此而已。
如果你已下载本书,则在名为 code / making_gem 的文件夹中,将看到一个名为 hello_gem 的文件夹。 它具有以下文件夹结构。
```rb
hello_gem/
hello_gem.gemspec
lib/
hello_gem.rb
```
要练习,请启动终端并导航至 hello + gem /目录。如果查看文件 [lib / hello_gem.rb](code/making_gem/hello_gem/lib/hello_gem.rb) ,则该文件具有以下代码
```rb
puts "Hello and welcome to the wonderful world of Ruby Gems."
```
如果你看一下代码,它仅包含一行 a,即可打印出`Hello and welcome to the wonderful world of Ruby Gems.`,仅此而已。 现在,进入使该程序成为宝石的文件。 查看文件 [hello_gem.gemspec](code/making_gem/hello_gem/hello_gem.gemspec)
```rb
Gem::Specification.new do |s|
s.name = 'hello_gem'
s.homepage = "https://i-love-ruby.gitlab.io"
s.version = '0.0.0'
s.date = '2018-12-02'
s.summary = "A gem that wishes you hello"
s.description = "A gem that wishes you hello. Written for I Love Ruby book."
s.authors = ["Karthikeyan A K"]
s.email = 'mindaslab@protonmail.com'
s.files = ["lib/hello_gem.rb"]
end
```
现在让我们检查一下。 在其中,我们以红宝石的方式描述了该宝石。 我们定义的一些东西是由`s.name`给出的名称; 其首页,即主要是`s.homepage`给出的可找到其源代码或可找到该 gem 的帮助和用法的位置; `s.version`给定的宝石的版本号; `s.date`给出的该版本的发布日期; `s.summary`给出的宝石的简要概述; 你可以使用`s.description`进行详细说明; 作者的名字可以用数组表示,如图`s.authors = ["Karthikeyan A K"]`所示; `s.email`给出的有关宝石交流的电子邮件地址; 最重要的是,该 gem 需要运行的所有程序文件都以`s.files = ["lib/hello_gem.rb"]`这样的数组形式给出。 在这里的例子中,我们只需要一个文件及其在 lib 目录中。
之所以给出`s.attrribute_name`,是因为我们使用`Gem::Specification.new`创建了 gem 规范对象,并将其捕获到变量`s`中,如图所示
```rb
Gem::Specification.new do |s|
# the specs goes here
end
```
现在我们需要做的就是构建 gemspec 文件来获取我们的 gem,我们可以使用以下命令来完成
```rb
$ gem build hello_gem.gemspec
```
你可能会看到一些警告消息,如下所示,请忽略它们,它们并不那么严重。
```rb
WARNING: licenses is empty, but is recommended. Use a license identifier from
http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
WARNING: See http://guides.rubygems.org/specification-reference/ for help
Successfully built RubyGem
Name: hello_gem
Version: 0.0.0
File: hello_gem-0.0.0.gem
```
如果你注意到,在同一文件夹中,你会看到一个名为 _hello_gem-0.0.0.gem_ 的文件,该文件名的 _hello_gem_ 部分来自 gemfile 中指定的`s.name` ,而 _0.0.0_ 来自 gemfile 中指定的`s.version`。
现在,使用下面的命令安装 gem
```rb
$ gem install hello_gem-0.0.0.gem
```
安装时,你将得到如下所示的输出
```rb
Successfully installed hello_gem-0.0.0
Parsing documentation for hello_gem-0.0.0
Installing ri documentation for hello_gem-0.0.0
Done installing documentation for hello_gem after 0 seconds
1 gem installed
```
让我们启动 irb 来测试宝石
```rb
$ irb --simple-prompt
```
现在在 irb 中,我们需要宝石,如下所示
```rb
>> require "hello_gem"
Hello and welcome to the wonderful world of Ruby Gems.
=> true
```
现在你可以看到输出 _,你好,欢迎来到 Ruby Gems 的美好世界。_ 。 恭喜,我们已经建立了自己的宝石。 现在,我们可以将其分发到整个世界。
### 24.7。 发布你的宝石
因此,我们创建了我们的宝石。 现在让我们看看如何发布。 第一步,你必须转到 [https://rubygems.org/sign_up](https://rubygems.org/sign_up) 并创建一个帐户。 记住你的用户名和密码。 为了使你的宝石独一无二,我们将宝石命名为 _<用户名> _hello_ 。 我的用户名是 mindaslab,因此我的宝石名称是 mindaslab_hello。
该宝石与先前的 _hello_gem_ 宝石非常相似。 它具有以下文件夹结构。 导航到 _mindaslab_hello /_ 文件夹
```rb
mindaslab_hello/
mindaslab_hello.gemspec
lib/
mindaslab_hello.rb
```
你可能想要遍历 [mindaslab_hello.gemspec](code/making_gem/mindaslab_hello/mindaslab_hello.gemspec) 和 [mindaslab_hello.rb](code/making_gem/mindaslab_hello/mindaslab_hello.gemspec) 。 最好修改 gemspec 文件,以便显示你的姓名和电子邮件,而不是显示我的名字和电子邮件。
现在在以下命令中构建 gem 类型
```rb
$ gem build mindaslab_hello.gemspec
```
你应该看到在同一文件夹中生成的名为 _mindaslab_hello-0.0.0.gem_ 的文件。 `build`命令将在终端中显示以下输出。
```rb
WARNING: licenses is empty, but is recommended. Use a license identifier from
http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
WARNING: no homepage specified
WARNING: See http://guides.rubygems.org/specification-reference/ for help
Successfully built RubyGem
Name: mindaslab_hello
Version: 0.0.0
File: mindaslab_hello-0.0.0.gem
```
现在让我们将宝石推到红宝石宝石网站。 你所要做的就是在显示的终端中输入命令`gem push <generated gem name>`。
```rb
$ gem push mindaslab_hello-0.0.0.gem
```
将提示你输入 Rubygems 用户名和密码,提供它们,然后你将看到如下所示的输出。
```rb
Pushing gem to https://rubygems.org...
Successfully registered gem: mindaslab_hello (0.0.0)
```
你可以转到 [https://rubygems.org](https://rubygems.org) 并输入你的宝石名称以进行搜索
![gems 817e2](https://img.kancloud.cn/b8/79/b87934332d4ac75b8182912e77c8899f_1287x630.jpg)
你将被带到你的 gem 页面,如下所示
![gems 07593](https://img.kancloud.cn/66/f9/66f9dfcbdf39f46a1075213b4c24542c_1287x2098.jpg)
现在,由于该宝石可在 Internet 上全局访问,因此你可以使用`gem install <gemfile name>`安装宝石,如下所示
```rb
$ gem install mindaslab_hello
```
它应该抛出如下所示的输出
```rb
Successfully installed mindaslab_hello-0.0.0
Parsing documentation for mindaslab_hello-0.0.0
Installing ri documentation for mindaslab_hello-0.0.0
Done installing documentation for mindaslab_hello after 0 seconds
1 gem installed
```
要测试你的宝石,请启动你的 irb。
```rb
$ irb --simple-prompt
```
然后需要你的宝石
```rb
>> require "mindaslab_hello"
```
如果你看到如下所示的输出,请给我发送电子邮件:)我们做到了。 击掌!!
```rb
Hello from Karthikeyan A K.
I am from Chennai, India.
=> true
>>
```
### 24.8。 更复杂的宝石
实际上,你将需要超过 1 个红宝石文件才能打包到你的宝石中。 打包的一种方法是列出 gemspec 文件中的所有文件,还是有更好的方法? 为了找出答案,请写一个叫做 shapes 的宝石。
我们将在名为 [circle.rb](code/making_gem/shapes/lib/models/circle.rb) , [rectangle.rb](code/making_gem/shapes/lib/models/rectangle.rb) 和 [square.rb](code/making_gem/shapes/lib/models/square.rb) 的文件中编写名为`Circle`,`Rectangle`和`Square`的三个类。 ,我们将这些文件放在一个名为`models/`的文件夹中,并将它们放在一个名为 [shapes.rb](code/making_gem/shapes/lib/shapes.rb) 的文件中,你可以看到如下所示的文件夹结构。
```rb
shapes/
shapes.gemspec
lib/
shapes.rb
models/
circle.rb
rectangle.rb
square.rb
```
现在`lib/`文件夹中的所有 ruby 文件和`lib/models/`文件夹中的文件都必须包含在 gemspec 文件中。 查看下面的 gemspec 文件
```rb
Gem::Specification.new do |s|
s.name = 'shapes'
s.version = '0.0.0'
s.date = '2018-12-02'
s.summary = "A gem to calculate area and perimeter of shapes."
s.authors = ["Karthikeyan A K"]
s.email = 'mindaslab@protonmail.com'
s.files = Dir["*/*.rb", "*/*/*.rb"]
end
```
看一下`s.files = Dir["**/**.rb", "**/**/*.rb"]`行,在这里我们不会写出非常冗长的文件列表。 相反,我们使用 Ruby 中的`Dir <sup class="footnote">[ [61](#_footnotedef_61 "View footnote.") ]</sup> 库来完成此任务。
要查看`Dir`的工作方式,请在`shapes/`目录中启动 irb 并输入以下内容
```rb
>> Dir["*/*.rb", "*/*/*.rb"]
```
你会看到它整齐地给出了主要和次要子文件夹中的 ruby 文件列表。
```rb
=> ["lib/shapes.rb", "lib/models/square.rb", "lib/models/rectangle.rb", "lib/models/circle.rb"]
```
因此,我们可以使用这些技巧在 gem 中包含很多文件。 现在,使用以下命令构建`gemspec`文件
```rb
$ gem build shapes.gemspec
```
如下所示,我们得到了一个不错的构建
```rb
WARNING: licenses is empty, but is recommended. Use a license identifier from
http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
WARNING: no homepage specified
WARNING: See http://guides.rubygems.org/specification-reference/ for help
Successfully built RubyGem
Name: shapes
Version: 0.0.0
File: shapes-0.0.0.gem
```
让我们安装如下所示的 gemfile ash
```rb
$ gem install shapes-0.0.0.gem
```
如你所见,它已成功安装
```rb
Successfully installed shapes-0.0.0
Parsing documentation for shapes-0.0.0
Installing ri documentation for shapes-0.0.0
Done installing documentation for shapes after 0 seconds
1 gem installed
```
通过编写一个名为 [testing_shapes.rb](code/making_gem/testing_shapes.rb) 的程序来测试 gem。
```rb
require "shapes"
square = Square.new
square.side = 7
puts "Area of square = #{square.area}"
circle = Circle.new
circle.radius = 7
puts "Area of circle = #{circle.area}"
```
现在运行它
```rb
$ ruby testing_shapes.rb
```
我们得到如下所示的输出。
```rb
Area of square = 49
Area of circle = 153.93804002589985
```
因此,我们已经看到了如何使用其中的更多文件来构建更复杂的 gem。
### 24.9。 需要其他宝石
### 24.10。 卸载宝石
最后,只需输入`gem uninstall <gemname>`即可卸载 gem,因此输入
```rb
$ gem uninstall shapes
```
你将得到如下所示的输出
```rb
Successfully uninstalled shapes-0.0.0
```
这表明 gem 已成功卸载。
- 前言
- 红宝石
- 先决条件
- 1.安装 Ruby
- 2.在线资源
- 3.入门
- 4.比较与逻辑
- 5.循环
- 6.数组
- 7.哈希和符号
- 8.范围
- 9.功能
- 10.可变范围
- 11.类&对象
- 12.安全导航
- 13.打破大型程序
- 14.结构和 OpenStruct
- 15. Rdoc
- 16. Ruby 样式指南
- 17.模块和混入
- 18.日期和时间
- 19.文件
- 20. Proc,Lambda 和块
- 21.多线程
- 22.异常处理
- 23.正则表达式
- 24.宝石
- 25.元编程
- 26.基准
- 27.测试驱动开发
- 28.观察者模式
- 29.模板模式
- 30.工厂模式
- 31.装饰图案
- 32.适配器模式
- 33.单例模式
- 34.复合模式
- 35.建造者模式
- 36.策略模式
- 赞助商
- 捐
- 人们怎么说
- 版权
- 取得这本书