更多「為什麼」和「什麼鬼」而非「如何」
多年來,RubyGems 開發團隊收到許多支援請求,這是新舊使用者經常提出的問題清單。
- 我使用
--user-install
安裝寶石,但他們的指令不可用 - 我如何信任自動下載的寶石程式碼?
- 為什麼
require 'some-gem'
會失敗? - 從 gem 載入檔案時,為何需要傳回 false?
我們也會在 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。