概要
pip コマンドでリモートの PyPI (Python Package Index) からではなく, ローカルにクローンした Git リポジトリからパッケージをインストールする方法についてのメモ書きです。
次の環境を想定していますが, Linux 環境でも同様に操作できると思います。
- MacOSX (Version 10.9.5)
- Python 3.4.2
動機
ある程度の規模のアプリケーションを Python で書いていると, pip でインストールしたパッケージに変更を加えたいことがあると思います。そのときに直接コードを書き換えると変更を元に戻すのが困難だし, 変更を上流に還元することが困難です。
ローカルにクローンした Git (ないし Mercurial) のリポジトリを Python パッケージとみなして pip でインストールすることができれば, この問題を解決することができます。
手順
適当なパスに Python パッケージをクローンします。ここでは Django を /tmp の下にクローンしてみます。
cd /tmp && git clone git@github.com:django/django.git
$HOME
の下に適当な Virtualenv を作ります。Python 2.x を使っている方は pyvenv を virtualenv に置き換えて読んでください。
pyvenv ~/dummy-project
source ~/dummy-project/bin/activate
先ほどクローンした Django を pip でインストールします。
pip install -e /tmp/django
さて, ここでインストールされた Django の django-admin.py
がどうなっているか確認してみましょう。
cat ~/dummy-project/bin/django-admin.py
#!/Users/aeas44/dummy-project/bin/python3.4
# EASY-INSTALL-DEV-SCRIPT: 'Django==1.9.dev20150318000307','django-admin.py'
__requires__ = 'Django==1.9.dev20150318000307'
import sys
from pkg_resources import require
require('Django==1.9.dev20150318000307')
del require
__file__ = '/private/tmp/django/django/bin/django-admin.py'
if sys.version_info < (3, 0):
execfile(__file__)
else:
exec(compile(open(__file__).read(), __file__, 'exec'))
注目すべきは __file__ = '/private/tmp/django/django/bin/django-admin.py'
の行です。MacOSX では /tmp
は /private/tmp
にシンボリックリンクされているので, これは先ほど /tmp
にクローンした Django が実態となっていることを意味しています。
/tmp
にクローンしたリポジトリを編集することで, 再インストールすることなく変更がプロジェクトに反映されます。必要があれば, 変更をコミットし, 上流に還元することも可能です。