virtualenvのpipでインストールしたFabricが実行できない件
今の業務で、Fabricを使ってサービスのリリース方法を改善しているところなんです。
夜に数時間ハマったにもかかわらず、次の日朝来たら一瞬で解決してしまうこの現象に名前を付けたい。
環境
CentOS 6.2
現象
リリース用のFabricスクリプトのリポジトリを作成している。
そのリポジトリのセットアップをするスクリプトが以下の順番で処理。
- 必要なパッケージ(gcc)のチェック(本当はpython-develもチェックしないといけない)
- グローバルにpipが無ければインストール
- グローバルにvirtualenvが無ければインストール
- リポジトリにvirtualenv用のディレクトリが無ければそのディレクトリに環境を作成して有効化
- pipで必要なパッケージをインストール ←問題はここ!!!
「リポジトリにvirtualenv用のディレクトリが無ければそのディレクトリに環境を作成して有効化」のところは以下の様なコードです。
virtualenv --distribute venv . venv/bin/activate
で!問題の「pipで必要なパッケージをインストール」のところです。
「グローバルにpipが無ければインストール」ではグローバルのpipなので実行にsudoが必要です。
しかし、そのノリで「pipで必要なパッケージをインストール」でsudoをつけると、いくらactivateしていても
グローバルのpipでインストールされてしまう(っぽい〜)
sudoをつけていても一見インストールされるのですが、fabを実行しようとするとエラーが出る。
Traceback (most recent call last): File "/usr/bin/fab", line 5, in <module> from pkg_resources import load_entry_point File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module> working_set.require(__requires__) File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require needed = self.resolve(parse_requirements(requirements)) File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve raise DistributionNotFound(req) pkg_resources.DistributionNotFound: paramiko>=1.10
完全にfabがグローバルのものを見てますね。
試しにpip list
を実行してみると意図したパッケージが全くインストールされていないでしょう。
なので、virtualenv環境ではsudoを外してpip install
を実行しましょう!
というお話でした。
なかなか解決しなかった訳
Mac OS X 10.9 Mavericksだと、setuptoolsの問題として既に既知のものとして似たようなものが公式のドキュメントやらStack Overflowにたくさん載っているわけで、疑うポイントがかなりずれてしまいましいた。。。
まあそもそもpipをなんとなく使っていたのがダメでしたがw
とはいえ、グローバルとローカルの問題ってわかってからは解決が早かったです。
こういう時はRubyでbundler使ってた経験が生かされますねwww