2012-02-21 14 views
12

私はローカルマシン上で開発環境の準備を自動化するために書いている小さなRubyスクリプトを持っています。私はrubyzip2ライブラリがすべてのマシンに存在することを確信できないため、必要なときにスクリプトをインストールしています。宝石をスクリプト内にインストールした後、どのように宝石をロードするのですか?

は現在、私のスクリプトは次のことをやっている:

begin 
    require 'zip/zip' 
rescue LoadError 
    system("gem install rubyzip2") 
end 

宝石がインストールされると、スクリプトは実行を続けます。しかし、宝石はロードされていないので、rubyzip2を必要とするすべてのコードが実行を停止します。

インストール後にスクリプトを実行できるように、gemをメモリにロードするにはどうすればよいですか?

答えて

6

1.10より高いバージョンbundlerhereを説明するように、あなたはその新しい「インライン」機能を使用することができます(ただgem install bundlerを実行して更新します)。gemfile方法の

require 'bundler/inline' 

gemfile(true) do 
    source 'https://rubygems.org' 
    gem 'catpix' 
end 

puts Catpix::VERSION 

最初のパラメータには、すでにユーザーのシステムにインストールされていない宝石をインストールする必要があるかどうかです。

1

アプリケーション/ライブラリにBundlerを使用してください。これにより、ユーザーはbundleを実行することができ、すべてのgemがフェッチされ、使用できるようになります。

16

require 'thegem'を実行してエラーを救済する代わりに、宝石の在庫状況を確認してから、必要に応じてインストールしてください。その後、それを要求することができます。

をインストールした後this post for the gem availability

それともthis post

EDIT

を見て、あなたはあなたのスクリプトをリロードしたくない場合は宝石のパスをクリアする必要があります。 あなたがこの方法でこれを実現できます。

Gem.clear_paths 

あり、すでに質問にhere

に答えているので、あなたのコードは、この(例)のように見えるはずです:あなたがしたいことがありので

begin 
    gem "rubyzip2" 
rescue LoadError 
    system("gem install rubyzip2") 
    Gem.clear_paths 
end 

require 'zip/zip' 
1

[OK]をBundlerを使用してGemfileをセットアップし、バンドルをバンドルインストールさせるには、bundlelerがすべてのgemを取り出してインストールしていなければインストールします。そして、gemfile内のすべてのgemを要求することができますファイル。詳細については、リンクのドキュメントをお読みください。

しかし、具体的に質問したいのは、retryキーワードを使用することです。このキーワードは、レスキューが呼び出された後にループを再試行します。

宝石が必要な場合、それは失敗し、ロードエラー例外が呼び出されます。開始ブロックが救済され、システムコールが宝石をインストールした後、再試行して宝石が必要になります。ただ一度だけ再試行するように条件を設定しない限り、これは無限ループにつながる可能性があるため、慎重にしてください。

begin 
    require 'zip/zip' 
rescue LoadError 
    system("gem install rubyzip2") 
    retry 
end 
+0

louiscoquioに記載された理由のため、これは機能しません。 – Yoni

関連する問題