自分の環境以外ではなかなか起こりそうにないレアなハマり方っぽいですがメモとして残しておきます。
背景
Tmuxでセッションを再現するためのRubyで実装されたラッパーのTmuxinatorですが、 gem install
で使われる事が想定されています。
自分はgemでインストールするソフトウェアもHomebrewにおけるBrewfileのようにdotfilesで管理したいと思っているので、dotfilesにGemfileを置いて、そこでbundlerを使ってインストールするようにしています。
更にグローバルな環境を汚染したくないため、 bundle install --path=vendor/bundle --binstubs=vendor/bin
を実行した上(毎回書くの面倒だからRakeタスクに書いてる)で ~/dotfiles/vendor/bin
にパスを通してそこに置いてあるファイルを実行するという方式でアプリケーションを起動していました。
起こったこと
Tmuxinatorで起動したtmux上でgemやbundleが正常に動作しない。
具体的には
- gemコマンドが何をしてもエラーになる
- bundle結果がそのディレクトリのGemfileを使ってくれない
-
gem uninstall
を実行するとエラーを吐いてgemが一切動かなくなる
などといった症状が出ました。
辛い
解決
検索してみると「tmuxinator rbenv」が候補として出てくるのでこのあたりが怪しいなと思って見ていると、環境変数の汚染が発生しているIssueが見つかりました。
auto setting RBENV_VERSION · Issue #99 · tmuxinator/tmuxinator
この問題は既に解決しており、tmux起動時に環境変数が初期化されるようになっているようなのですが、bundlerを経由していることでこれに近い現象が発生しているのではないかと思い、起動前と起動後で環境変数のdiffを取ってみました。
結果として
BUNDLE_BIN_PATH
BUNDLE_GEMFILE
GEM_HOME
GEM_PATH
RUBYLIB
RUBYOPT
が上書きされていました。
なので、tmux起動時にその辺の環境変数を一旦初期化する処理を挟めば正常にbundlerが動作するようになりました。
set-environment -gu BUNDLE_BIN_PATH
set-environment -gu BUNDLE_GEMFILE
set-environment -gu GEM_HOME
set-environment -gu GEM_PATH
set-environment -gu RUBYLIB
set-environment -gu RUBYOPT