## 24.寶石
寶石是紅寶石的包裝管理材料。 例如,你可能想用紅寶石做某事,例如說比較兩個哈希,而不是自己編寫代碼,而是可以搜索位于 [http://rubygems.org](http://rubygems.org) 的 ruby gems 存儲庫。
### 24.1。 搜索寶石
因此,讓我們比較兩個哈希。 有一個稱為 hash_compare 的 gem,用于比較散列。 現在,你可以轉到 [http://rubygems.org](http://rubygems.org) 并搜索“哈希比較”,而無需使用雙引號

你將獲得一個如下所示的頁面,單擊“哈希比較”鏈接,你將被定向到此頁面。 [https://rubygems.org/gems/hash_compare](https://rubygems.org/gems/hash_compare)

這就是你搜索寶石的方式。 相反,如果你搜索確切的寶石名稱 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) 并輸入你的寶石名稱以進行搜索

你將被帶到你的 gem 頁面,如下所示

現在,由于該寶石可在 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.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書