gem がインストールされていますが、require 'gemname' が機能しません。なぜ?

StackOverflow https://stackoverflow.com/questions/132867

  •  02-07-2019
  •  | 
  •  

質問

私が本当に尋ねたいのは、なぜ require が gem の名前を取得しないのかということです。また、そうでない場合、そのいまいましいことを必要とする秘密の呪文を見つける最も簡単な方法は何ですか?

例として、私が持っている場合 memcache-client インストールされたら、それを使用して要求する必要があります

require 'rubygems'
require 'memcache'
役に立ちましたか?

解決

どのようなファイルを含める必要があるかについての標準はありません。ただし、一般的に従うことができる規則がいくつかありますので、それに従って試してみてください。

  • 多くの場合、ファイルは宝石と同じ名前と呼ばれます。それで require mygem働くでしょう。
  • 多くの場合、このファイルは宝石のlibサブディレクトリにある唯一の.rbファイルです。したがって、宝石の名前を取得できる場合(2.1 Railsプロジェクトでベンダー/宝石を介してitterるかもしれません)、検査できます。#{gemname}/lib .RBファイルの場合、そして1つしかない場合、それはかなり良い賭けですそれは要求するものです

それがすべてうまくいったら、gem のディレクトリを調べるだけです (ディレクトリは次のコマンドを実行すると見つかります) gem environment | grep INSTALLATION | awk '{print $4}' そして lib ディレクトリを見ると、おそらくファイルを読んで、何をすべきかを説明するコメントがあることを期待する必要があるでしょう。

他のヒント

私のシステムも、私が指示しない限り、RubyGems の存在を知らないようです。「require」コマンドは RubyGems によって上書きされるため、Gem を読み込むことができますが、RubyGems がすでに必要とされていない限り、その方法がわかりません。したがって、独自に作成する場合は、次のようにすることができます。

require 'rubygems'
require 'gem-name-here'

他の人のコードを実行している場合は、コマンドラインで次のように実行できます。

ruby -r rubygems script.rb

また、Ruby が起動時に何をロードするかを決定するために使用する環境変数もあります。

export RUBYOPT=rubygems

(から http://www.rubygems.org/read/chapter/3. 。環境変数のことは私に指摘されました オリオン・エドワーズ)

(ただし、「require 'rubygems'」が機能しない場合、このアドバイスはあまり役に立ちません:)

require は Ruby のパス内のファイルにマップする必要があります。「gem 環境」を実行すると、gem がインストールされている場所を確認できます (インストール ディレクトリを探します)。

kburton@hypothesisf:~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.2.0
  - RUBY VERSION: 1.8.7 (2008-08-08 patchlevel 71) [i686-linux]
  - INSTALLATION DIRECTORY: /usr/local/ruby/lib/ruby/gems/1.8
  - RUBY EXECUTABLE: /usr/local/ruby/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/ruby/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86-linux
  - GEM PATHS:
     - /usr/local/ruby/lib/ruby/gems/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://gems.rubyforge.org/
kburton@editconf:~$ 

次に、必要としている特定の .rb ファイルを検索できます。さらに、$ の内容を出力することもできます。irb から、Ruby がモジュールを検索するパスのリストを確認します。

kburton@hypothesis:~$ irb
irb(main):001:0> $:
=> ["/usr/local/ruby/lib/ruby/site_ruby/1.8", "/usr/local/ruby/lib/ruby/site_ruby/1.8/i686-linux", "/usr/local/ruby/lib/ruby/site_ruby", "/usr/local/ruby/lib/ruby/vendor_ruby/1.8", "/usr/local/ruby/lib/ruby/vendor_ruby/1.8/i686-linux", "/usr/local/ruby/lib/ruby/vendor_ruby", "/usr/local/ruby/lib/ruby/1.8", "/usr/local/ruby/lib/ruby/1.8/i686-linux", "."]
irb(main):002:0>

また、レールの人は次のことを覚えておく必要があります Railsサーバーを再起動します gemをインストールした後

「rubygems」を含める必要があるのは、次を使用して gem をインストールした場合のみです。 宝石 。そうでなければ、秘密の呪文が発動することになるだろう irb さまざまな組み合わせを試してください。また、渡すこともできます -私 Ruby インタープリターのオプションを使用して、 gem のインストール ディレクトリを LOAD_PATH 。ご了承ください $LOAD_PATH は array です。これは、スクリプト内からディレクトリを追加できることを意味します。

私が本当に尋ねたいのは、なぜ require が gem の名前を取得しないのかということです。

gem をインストールすると、システムにファイルが取得されます。これらのファイルが何と呼ばれるかについては何も主張しません。
ローリーが指摘するように 名前の付け方にはいくつかの規則がありますが、それを強制するものは何もなく、残念ながら多くの gem 作成者はそれらに固執していません。

また、そうでない場合、そのいまいましいことを必要とする秘密の呪文を見つける最も簡単な方法は何ですか?

gem のドキュメントを読みますか?
グーグルで見つけたのは rdoc gemname 通常は見つかります gem の公式 Rdocs, 通常、その使用方法が示されています。

Memcache は、レールから使用することを想定しており、「require」がすでに行われているため、おそらく最良の例ではありませんが、私が見た他のほとんどのものには、正しい「require」を示す例があります。呪文

私が遭遇した問題は、実際に構築された gem に必要なファイルがすべて含まれていないということでした。

の問題 files gemspec に構文ミスがありましたが、ビルド中にエラーはスローされませんでした。

他の誰かが同じ問題に遭遇した場合に備えて、ここにこれを追加するだけです。

私も OS X Lion をインストールして以来この問題に悩まされており、次のコードを実行しても警告メッセージが表示されることがわかりました。require 'rubygems' require 'nokogiri'

ここや Web に掲載されている解決策をたくさん試しましたが、最終的に回避策は、単に次の手順に従うことでした。 http://martinisoftware.com/2009/07/31/nokogiri-on-leopard.html LibXML と LibXSLT をソースから再インストールする必要がありましたが、インストールした LibXML のバージョンが Nokogiri によって予期されたものと一致していることを確認しました。

それを実行すると、警告は消えました。

RVM を使用していて、間違ったバージョンの Ruby を使用しようとしたため、この問題が発生しました。問題の gem には 1.9.2 が必要でしたが、私はデフォルトとして 2.0.0 を設定していました。おそらく愚かな間違いですが、このページにアクセスした他の誰かが犯した可能性があります。

gem のソースを見て確認してください lib ディレクトリ。ない場合 rb ファイルの場合は gem main を指定する必要があります rb サブディレクトリ内のファイル:

require 'dir/subdir/file'

のために /lib/dir/subdir/file.rb.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top