【翻訳+解説】binstubをしっかり理解する: RubyGems、rbenv、bundlerの挙動

こんにちは、hachi8833です。 Rails関連の記事でbinstubについてちょくちょく見かける割に、ちゃんとした理解がつい後回しになっていたので、rbenvのwikiにあるUnderstanding binstubs をこの機会にさっと訳してみました。原文の最終更新は2015年11月です。なお、訳文では原則「binstub」と単数形で表記しています。 さらに、訳文の技術チェックを行っていただいた弊社Webチーム部長のmorimorihogeさんによる解説を翻訳の後に追加いたしましたので、合わせてご覧ください。 binstubを理解する (Mislav Marohnićの許諾を得て翻訳・公開) 原文: Understanding binstubs 著者: Mislav Marohnić他 binstubとは、実行可能ファイルのラッパースクリプトです。ここで言う実行可能ファイルは「バイナリ」を指すこともありますが、コンパイルされたバイナリでなくても構いません(訳注:シェルスクリプト等も対象です)。binstubの目的は、その実行可能ファイルを呼び出す前に環境を整えることです。 Rubyでよく使われるのは、何らかの実行可能ファイルを含むgemをインストールしたときに、RubyGemsによって生成されるbinstubです。しかし、binstubの記述にはどんな言語でも使えるので、多くの開発者がしばしばbinstubを自作しています。 RubyGems gem install rspec-coreを実行したときの動作を詳しく見てみましょう。RSpecの最終的な実行可能ファイルは、gemの中にある./exe/rspecです 。gemをインストールすると、RubyGemsによって次の実行可能ファイルが提供されます。 <ruby-prefix>/bin/rspec (RubyGemsが生成するbinstub) <ruby-prefix>/lib/ruby/gems/1.9.1/gems/rspec-core-XX.YY/exe/rspec (本来の実行可能ファイル) 2番目の実行可能ファイルのラッパーです(訳注: このラッパーのことをbinstubと呼びます)。RubyGemsはこのbinstubを<ruby-prefix>/binに配置します。このディレクトリは$PATHに設定済みであることが前提です(設定はrvmやrbenvなどのRubyバージョンマネージャの仕事です)。 2番目のファイル(本来の実行可能ファイル)がRubyGemsによってインストールされるディレクトリは、$PATHには含まれていません。仮に本来の実行可能ファイルが$PATHにインストールされたとしても、Rubyプロジェクト内の実行可能ファイルは、たいてい適切なセットアップ処理なしに直接実行されることを意図していないため、安全に実行できないと考えておく方がよいでしょう。少なくとも、実行可能ファイルのプロジェクトのソースファイルをrequireするために、$RUBYOPTを設定する必要があるでしょう。 こうして生成されたbinstubファイル<ruby-prefix>/bin/rspecは、次のような短いRubyスクリプトです(やや簡略化してあります)。 #!/usr/bin/env ruby require ‘rubygems’ # Prepares the $LOAD_PATH by adding to it lib directories of the gem and # its dependencies: gem ‘rspec-core’ # Loads the … Continue reading 【翻訳+解説】binstubをしっかり理解する: RubyGems、rbenv、bundlerの挙動