RubyGems 導覽選單
指南

更多「為什麼」和「什麼鬼」而非「如何」

多年來,RubyGems 開發團隊收到許多支援請求,這是新舊使用者經常提出的問題清單。

我們也會在 Bundler.io Slack 上回答問題。您可以在支援網站上找到的部分資訊包括

我已使用 --user-install 安裝 gem,但其指令不可用 —————————————————————————

當您使用 --user-install 選項時,RubyGems 會將 gem 安裝到您主目錄內的目錄中,例如 ~/.gem/ruby/1.9.1。您安裝的 gem 所提供的指令會出現在 ~/.gem/ruby/1.9.1/bin 中。若要讓在那裡安裝的程式對您可用,您需要將 ~/.gem/ruby/1.9.1/bin 加入您的 PATH 環境變數中。

例如,如果您使用 bash,您可以透過將類似這樣的程式碼加入您的 ~/.bashrc 檔案中,將該目錄加入您的 PATH

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

將此程式碼加入您的 ~/.bashrc 之後,您需要重新啟動您的 shell,變更才會生效。您可以透過開啟新的終端機視窗,或在您已開啟的視窗中執行 exec $SHELL 來執行此動作。

我如何信任自動下載的寶石程式碼?

您可以信任從網路上安裝的任何其他程式碼的方式相同:最終,您無法信任。您有責任了解您所使用的 gem 的來源。在安全性至關重要的設定中,您應該只使用已知的良好 gem,並可能對 gem 程式碼執行您自己的安全性稽核。

Ruby 社群正在討論未來讓 gem 程式碼更安全的各種方法,並使用一些公開金鑰基礎架構。若要查看此討論的進度,請在 GitHub 上拜訪 rubygems-trust 組織。

為什麼 require 'some-gem' 會失敗?

並非每個函式庫都可以在 gem 的名稱與您需要載入的檔案名稱之間進行嚴格的對應。您應該先檢查檔案是否正確配對

$ gem list RedCloth

*** LOCAL GEMS ***

RedCloth (4.1.1)
$ ruby -e 'require "RedCloth"'
/Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- RedCloth (LoadError)
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
  from -e:1
$ gem contents --no-prefix RedCloth | grep lib
lib/case_sensitive_require/RedCloth.rb
lib/redcloth/erb_extension.rb
lib/redcloth/formatters/base.rb
lib/redcloth/formatters/html.rb
lib/redcloth/formatters/latex.rb
lib/redcloth/formatters/latex_entities.yml
lib/redcloth/textile_doc.rb
lib/redcloth/version.rb
lib/redcloth.rb
$ ruby -e 'require "redcloth"'
$ # success!

如果您載入的是正確的檔案,也許 gem 使用的 ruby 與 ruby 不同

$ which ruby
/usr/local/bin/ruby
$ gem env | grep 'RUBY EXECUTABLE'
   - RUBY EXECUTABLE: /usr/local/bin/ruby1.9

在此範例中,我們有兩個 Ruby 安裝,因此 gem 使用的版本與 ruby 不同。調整符號連結應該可以解決這個問題

$ ls -l /usr/local/bin/ruby*
lrwxr-xr-x  1 root  wheel       76 Jan 20  2010 /usr/local/bin/ruby@ -> /usr/local/bin/ruby1.8
-rwxr-xr-x  1 root  wheel  1213160 Jul 15 16:36 /usr/local/bin/ruby1.8*
-rwxr-xr-x  1 root  wheel  2698624 Jul  6 19:30 /usr/local/bin/ruby1.9*
$ ls -l /usr/local/bin/gem*
lrwxr-xr-x  1 root  wheel   76 Jan 20  2010 /usr/local/bin/gem@ -> /usr/local/bin/gem1.9
-rwxr-xr-x  1 root  wheel  550 Jul 15 16:36 /usr/local/bin/gem1.8*
-rwxr-xr-x  1 root  wheel  550 Jul  6 19:30 /usr/local/bin/gem1.9*

您可能也需要對 irb 執行相同的處理。

從 gem 載入檔案時,為何需要傳回 false?

從 gem 載入檔案時,Require 會傳回 false。通常,require 在正確載入時會傳回 true。出了什麼問題?

沒有問題。嗯,有點問題。但不是您需要擔心的問題。

require 方法傳回 false 並不表示錯誤。這只表示檔案已經載入。

RubyGems 有一個功能,可以在 gem 啟用(即選取)時自動載入檔案。當您需要在非作用中 gem 中的檔案時,RubyGems 軟體會為您啟用該 gem。在啟用期間,任何自動載入的檔案都會為您載入。

因此,當您的 require 敘述實際執行載入檔案的工作時,它已經透過 gem 啟用自動載入,因此敘述傳回 false。