質問
Twitter メッセージを受信したときに Ruby を使用して通知できるように、Ruby Gems をインストールしようとしています。ただし、 gem update --system
, 、実行しようとするたびに zlib エラーが発生するようになりました。 gem install
何の。以下は、Ruby gem をインストールしようとしたときに得られるコンソール出力です。(からの出力とともに gem environment
).
C:\data\ruby>gem install twitter
ERROR: While executing gem ... (Zlib::BufError)
buffer error
C:\data\ruby>gem update --system
Updating RubyGems
ERROR: While executing gem ... (Zlib::BufError)
buffer error
C:\data\ruby>gem environment
RubyGems Environment:
- RUBYGEMS VERSION: 1.2.0
- RUBY VERSION: 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
- INSTALLATION DIRECTORY: c:/ruby/lib/ruby/gems/1.8
- RUBY EXECUTABLE: c:/ruby/bin/ruby.exe
- EXECUTABLE DIRECTORY: c:/ruby/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-mswin32-60
- GEM PATHS:
- c:/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/
解決
私も今夜から受け取り始めました。グーグルで検索すると、結果が得られなかった提案がたくさん出てきました
gem update --system
そして、package.rb内の関数を置き換えるはずのjamisからのコードを貼り付けましたが、置き換えられるはずの元のコードがどこにも見つかりません。
Rubygemsを再インストールしてもダメでした。今Rubyを再インストール中ですが……直りました。でも痛い。
他のヒント
それを見つけた!Windowsでも同じ問題が発生しました(アップデートをしていなくても突然現れましたが、何でもありました)。
これは、複数の競合する zlib バージョンに関係があると思います (私はそう思います)。
Ruby/lib/ruby/1.8/i386-msvcrt に、zlib.so ファイルが存在することを確認します。私の場合、それはすでに存在していました。そうでない場合は、ruby-zlib をインストールしてみてください。
次に、ruby/lib/ruby/site_ruby/1.8./i386-msvcrt に移動し、そこにある zlib.so ファイルを削除します。
Ruby/bin には zlib1.dll があるはずです。何らかの理由で、私の Ruby バージョンではこの DLL が使用されませんでした。最新バージョン (1.2.3) をダウンロードして、そこにインストールしました。使用するには名前を zlib.dll に変更する必要がありました。
そしてタダ!Rubygems が再び動作しました。
お役に立てれば。
まず、zlib が見つからない問題の解決策を考え出した人に感謝します。(それは私ではありませんでした。:-)
残念ながら、元の投稿へのリンクを失ってしまいましたが、Linux での解決策の本質は、zlib ヘッダー ファイルが Ruby 構成スクリプトで利用できる間に Ruby をコンパイルすることです。Debian では、Ruby のコンパイルを開始する前に zlib 開発パッケージをインストールする必要があることを意味します。
ここでの私のテキストの残りの部分には新しい内容は何も含まれていません。UNIX 系オペレーティング システムで実行環境をカスタマイズすることに慣れている場合は、省略することをお勧めします。以下は、いくつかの基本の簡単な紹介とステップバイステップの説明を組み合わせたものです。
-------HOW-TO の始まり -----------------------
プログラム、たとえば irb をコンソールから実行したい場合、irb という名前のファイルが、PATH と呼ばれる環境変数で記述された順序でフォルダーから検索されます。bash シェルに入力して (Enter キーを押して)、PATH の値を確認できます。
echo $PATH
たとえば、システム内に 2 つのバージョンの irb があり、1 つは「公式」パッケージ管理システム、たとえば yum または apt-get によって /usr/bin/irb にインストールされ、もう 1 つはscoobydoo という名前のユーザーが /home/scoobydoo/ourcompiledruby/bin に存在すると、2 つの irb-s のうちどちらが実行されるかという疑問が生じます。
/home/scoobydoo/.bashrcに書いた場合:
export PATH="/home/scoobydoo/ourcompiledruby/bin:/usr/bin"
ターミナルウィンドウを閉じて新しいウィンドウを開くことにより、バッシュシェルを再起動し、IRBをコンソールに入力して、/home/scoobydoo/ourcompiledruby/bin/IRBが実行されます。誰かが書いたら
export PATH="/usr/bin:/home/scoobydoo/ourcompiledruby/bin"
/home/scoobydoo/.bashrcに、/usr/bin/IRBが実行されます。
実際に書きたいのは
export PATH="/home/scoobydoo/ourcompiledruby/bin:$PATH"
これは、この割り当ての前に PATH が持っていたすべての値を /home/scoobydoo/ourcompiledruby/bin に付加するためです。そうしないと、すべての共通ツールが /usr/bin に存在するわけではなく、おそらく複数のカスタム ビルド アプリケーションを使用する必要があるため、問題が発生します。
環境変数の名前が LD_LIBRARY_PATH であることを除いて、同じロジックがライブラリに適用されます。
LD_LIBRARY_PATH と PATH を使用すると、root アクセス権を持っていない、または信頼されていないソフトウェアを試したい一般ユーザーでも、root 権限を必要とせずにそれらを構築して使用できます。
このミニハウツーの残りの部分では、独自のバージョンの Ruby を構築し、ディストリビューションの公式パッケージ管理ソフトウェアによってシステムに何がインストールされているかにほぼ関係なく、独自のバージョンを使用することを前提としています。
1)=============================
まず、いくつかのフォルダーを作成し、フォルダーが「役立つ」ように環境変数を設定します。
mkdir /home/scoobydoo/ourcompiledruby
mkdir -p /home/scoobydoo/lib/our_gems
次の2行を/home/scoobydoo/.bashrcに追加します
export PATH="/home/scoobydoo/ourcompiledruby/bin:$PATH"
export GEM_HOME="/home/scoobydoo/lib/our_gems"
現在のターミナル ウィンドウを閉じて新しいターミナル ウィンドウを開くか、次のように入力して bash シェルを再起動します。
bash
現在開いているウィンドウのコマンドライン上で。/home/scoobydoo/.bashrcの変更は、/home/scoobydoo/.bashrcの修正バージョンの保存の前に開始された端末のウィンドウ/セッションに影響を与えません。 /.BASHRCは、SSHを介してログオンしても、セッションの開始時に自動的に実行されます。
2)=============================
ここで、zlib 開発パッケージがシステム上で利用可能であることを確認します。2011年4月現在、詳細はまだ整理できておりませんが、
apt-get install zlibc zlib1g-dev zlib1g
Debian システムでは十分なようです。考え方としては、ライブラリ ファイルとヘッダー ファイルの両方がシステムの「公式」検索パスで利用できるということです。通常、apt-get などはヘッダー ファイルを /usr/include に配置し、ライブラリ ファイルを /usr/lib に配置します。
3)=============================
ソース tar.gz をダウンロードして解凍します。 http://www.ruby-lang.org
./configure --prefix=/home/scoobydoo/ourcompiledruby
make
make install
4)=============================
次のようなコンソールコマンドの場合
which ruby
コンソールに出力します
/home/scoobydoo/ourcompiledruby/bin/ruby
新しくコンパイルされたバージョンがコマンドで実行されるバージョンになります。
ruby --help
5)=============================
残りのプログラム、gem、irb などは、次のようなコマンドを使用して適切に実行できます。
ruby `which gem` install rake
ruby `which irb`
そんなはずはないのですが、2011 年 4 月の時点では、これ以上エレガントな方法を私は思いつきませんでした。もし
ruby `which gem` install rake
再び zlib が見つからないというエラーが表示される場合は、zlib インクルード ファイルとライブラリを Ruby 構成スクリプトで使用できるようにして再コンパイルする方法を考えてみてください。(申し訳ありませんが、現時点ではこれより良い解決策を提案することができません。)
汚い解決策は、/home/scoobydoo/.bashrcに次の行を追加するためのものかもしれません
alias gem="`which ruby` `which gem` "
alias irb="`which ruby` `which irb` "
実は私が普段使っているのは、
alias irb="`which ruby` -KU "
ただし、Gem は Ruby に「-KU」引数を与えずに実行する必要があります。そうしないとエラーが発生します。
-------HOW-TO の終わり -----------------------
Ruby を再インストールすると、この問題は解決されました。それは私が望んでいたものではありません。問題が発生した理由を知りたかったのですが、すべて解決されました。
ほとんどの場合、ダウンロードが失敗したときに表示されます。ネットワークタイムアウト、手動ダウンロードの不備などにより、Gem が破損しています。もう一度試すか、手動で宝石をダウンロードしてポイントしてください gem
ファイルで。
もし gem update --system
機能しないので名前を変更する ruby/bin/zlib1.dll
に zlib.dll
試してみても役に立ちません:
ファイルを開く RUBY_DIR\lib\ruby\site_ruby\1.8\rubygems.rb
そして、存在したものを置き換えます def self.gunzip(data)
これで:
def self.gunzip(data)
require 'stringio'
require 'zlib'
data = StringIO.new data
# Zlib::GzipReader.new(data).read
data.read(10) # skip the gzip header
zis = Zlib::Inflate.new(-Zlib::MAX_WBITS)
is = StringIO.new(zis.inflate(data.read))
end
cd で Rubysrc/ext/zlib に移動してみてはどうでしょうか ruby extendconf.rb
, 、 それから make
, make install
.
それを行った後、Rubyを再インストールします。
ubuntu 10.04でこれを実行し、成功しました。
他のすべてが失敗した場合は、純粋な Ruby zlib をインストールします