virtualenv使っていると、仮想環境ごとに同じようなパッケージ(Flask,SQLAlchemy,pyqueryなんか)を何度もダウンロードすることになり、帯域の無駄遣いだよなと思っていた。それから、東京出張の際に新幹線の中でコード書いてることが多いんだけど、大抵三島-新横浜間のどこかで一度はイラッとするのもどうにかならんかと。
perlでいうところのminicpanみたいなのないかなぁと調べてみたらpep381client使えっていうやりとりをみつけたので調べてみた。ここなんかよくまとまっている。
ぱっと見ると、pep381clientがいいかなと思うんだけどPYPIのほぼ完全なミラーを作る感じだし、これはノートに入れて持ち歩くにはでかすぎるだろ(30Gくらいのストレージが必要)っていう理由で保留。まぁ、職場にミラーつくるんだったらいいんだろうなぁと思い、使ってみようかなとふとissue見たどうなんだろうね?って思った(パッチ当てたのもあるけどね)。
collective.eggproxyはキャッシュプロキシサーバーであり、キャッシュされてないパッケージはネットワークにつないでダウンロードする必要がある。これはローカルにミラーを用意したいという自分の用途には微妙に合わない。サーバー動かしておくのもなんかめんどくさいなーと。
決定打が見つからないまま悶々としたあげく、結局新しいパッケージを頻繁に入れることは少ないからキャッシュ使うっていう方法でも結構いけそうだからcollective.eggproxyでいこうかなぁと、pip installしたら、ふとpipにキャッシュのオプションあるんじゃないの?と調べたらあったというオチ。
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
こんだけだった。pipのドキュメントにもchangelogのとこにちょろっと書いてあるだけだったので見逃してた。
pip自体にキャッシュの仕組みがあるんだったらダウンロードキャッシュにPYPIの最新パッケージだけをミラーするスクリプトを書けばpipからはきちんとPYPIに繋がって適切に処理しているように見えるからこのやり方でいいんじゃないかと思ったので、改めてこれをacupと名付けよう。
- acup(上のやつ、やっつけスクリプト)
- bcup(minicpan相当のやつ)
- ...
- fcup(pep381client)
という妙な脳内認識が出来上がってしまった。