パッケージングの今と未来

42
パッケージングの今と未来 aodag

Transcript of パッケージングの今と未来

パッケージングの今と未来

aodag

お前だれよ?

aodag = Atsushi ODAGiri

株式会社ビープラウド勤務

Pylonsproject.jp

Pythonサポーターズ

PyCon APAC 2013 パトロン

お前だれよ?(cont)

python1.5から!

文字列処理とか秘密の道具

Zope, TurboGears, Pylons/Paste/WSGI, Repoze, Pyramid!Django?なにそれ?

PythonのWebフレームワークってどのくらいZopeにするかってことだよね?

あじぇんだ

● パッケージングの今● パッケージングの未来● Python3.4に期待されること

ヽ(´_・ω・)_

こわくないよ

現在のツール

● distribute○ setup.py○ pkg_resources○ egg

● virtualenv● pip

what's setup.py?

配布物を作る、PYPIに登録やアップロードする、配布物をインストールする

$ python setup.py test build sdist register upload

$ python setup.py install

what's setup.py? (cont)

標準ライブラリ distutilsdistutils.core.setup

拡張 setuptools/distributesetuptools.setup

パッケージメタデータ 1.0

setup関数で作成

パッケージ名バージョン作成者、メンテナなど基本的な情報

egg-info

依存ライブラリプラグインのエントリポイントなど

拡張されたメタデータ

仮想環境の今の使い方

● virtualenvで仮想環境作成○ virtualenvwrapperはそこそこ便利

● pipでパッケージインストール

$ mkvirtualenv some-project(some-project) $ pip install pyramid(some-project) $ pip freeze

helloコマンドの作成とパッケージング

$ mkvirtualenv hello(hello) $ pip install pastescript(hello) $ paster create hello(hello) $ cd hello(hello) $ pip freeze(hello) $ pip install -e .hello-0.0dev

hello/__init__.py

def hello(): print "Hello, world!"

hello/__main__.py

from . import hello

if __name__ == '__main__': hello()

(hello) $ python -m helloHello, world!

メタデータ

(hello) $ python setup.py egg_info(hello) $ cat hello.egg-info/PKG-INFO(hello) $ cat hello.egg-info/entry_points.txt

console_scripts

setup.py

entry_points="""[console_scripts]hello=hello:hello"""

(hello) $ pip install -e .(hello) $ helloHello, world!

パッケージング

(hello) $ python setup.py sdist(hello) $ ls disthello-0.0dev.tar.gz

公開(without PyPI)

bitbucketなど用意

例えば https://bitbucket.org/aodag/python-hello

$ hg init$ hg add setup.py setup.cfg hello/__init__.py hello/__main__.py$ hg commit$ hg push

リリース

リリースブランチ$ hg branch rel-0.1

setup.cfg;tag_build = dev ; コメントアウト

setup.pyversion = "0.1"

リリース

$ hg commit$ hg tag hello-0.1 # egg name$ hg push --new-branch

https://bitbucket.org/aodag/python-hello/get/hello-0.1.zip

インストールしてみよう

$ mkvirtualenv hello2(hello2) $ pip install https://bitbucket.org/aodag/python-hello/get/hello-0.1.zip(hello2) $ pip freeze

パッケージングの未来

現在の問題点● eggは標準じゃない● eggはpure pythonのパッケージでもプラット

フォーム、pythonバージョンごとに作成● setup.py には実際のところなんでも書けてしま

う● Linuxディストリビューションなどのパッケージ管

理と競合する

packaging

python3.3に入る予定だった

setuptoolsなどの成果を標準化することが期待されていた

entry_pointやscriptsなどの拡張性について議論しきれてなかった実装もなかなか進まなかった

python3.3からdrop

パッケージインストールデータベース

PEP376

配布物に含まれるファイルを追記どのインストーラ(pipやdpkg,rpmなど)がインストールしたのか?ユーザーが指定したのか、依存関係の結果インストールされたのか?

などを記録

wheelパッケージコンテナ PEP427

eggから発展

パッケージインストールデータベースに対応より柔軟なプラットフォーム対応きちんとPEPで議論済

メタデータ2.0 PEP426

egg-infoなどから、追加項目

依存ライブラリや提供パッケージなど。

setuptoolsとdistributeが合流

setuptoolsがあまりにも更新やバグフィックスが遅いdistributeにフォーク

distributeで2to3やpython3対応などが進む

setuptools0.7でdistributeが合流、成果をマージ

distribute0.7はsetuptools0.7以降へのアップグレード用

pypa

setuptools, pip, virtualenvなどの実装、メンテナンスをするグループ

http://github.com/pypahttp://bitbucket.org/pypa

distlib/distil

distlibパッケージング関連のPEPを実装

distildistlibの機能をpipにマージするための実験的実装

distlibのサポートPEP

database PEP376metadata 2.0, 1.2, 1.1 PEP345,314,241version PEP386,426Wheel PEP427

現在の状況

pippip1.4でwheelに対応

setuptoolssetuptools0.8で2to3を必要としなくなった -> wheelにできるようになる

virtualenvsetuptools0.7以降に対応

残る問題

メタデータ2.0

distlibはメタデータ2.0をサポートしているがpypackage.jsonを書かないといけない

bdist_wheelはsetup.pyからメタデータを生成するが、対応しているのはメタデータ1.0

pyvenv

virtualenvの機能をPython標準にとりこみ

Python3.3以降で利用可能

virtualenvが標準ライブラリをコピーするのに対して、pyvenvはsite.pyの入れ替えのみで対応

未来を感じてみよう

Python3.3は入ってますよね?

$ mkdir hello33; cd hello33$ pyvenv env$ . env/bin/activate(hello33) $ wget https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py(hello33) $ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py

Don't think FEEL

$ pip install -U setuptools==0.8$ pip install -U https://github.com/pypa/pip/archive/1.4rc2.tar.gz$ pip install wheel

準備完了

wheeling!

C拡張あり

$ pip wheel Pillow$ ls wheelhousePillow-2.1.0-cp33-cp33m-linux_x86_64.whl

C拡張なし

$ pip wheel webob$ ls wheelhouseWebOb-1.2.3-py33-none-any.whl

use it!

インストールして使う$ pip install wheelhouse/WebOb-1.2.3-py33-none-any.whl

マウントして使うimport distlib.wheeldistlib.wheel.Wheel('wheelhouse/Pillow-2.1.0-cp33-cp33m-linux_x86_64.whl')import PIL

Python3.4に期待すること

pipをインストールするスクリプトをバンドル

distlibを標準ライブラリにとりこみ

心配事について

ツールは変わる?pipは続投されるはず

setuptoolsは一部の機能をdistlibに任せるようになるはず

パッケージング方法は変わる?bdist_wheelがメタデータ2.0をサポートすれば、現在のsetup.py方式のままいけるはず

まとめ

パッケージングの情報は分散していてわかりにくい今後のパッケージング方法はPython3主体

Python2の間はsetuptoolsがわかればOK公開しない場合でもsetup.py書こう