パッケージングの今と未来
aodag
お前だれよ?
aodag = Atsushi ODAGiri
株式会社ビープラウド勤務
Pylonsproject.jp
Pythonサポーターズ
PyCon APAC 2013 パトロン
お前だれよ?(cont)
python1.5から!
文字列処理とか秘密の道具
Zope, TurboGears, Pylons/Paste/WSGI,
Repoze, Pyramid!
Django?なにそれ?
PythonのWebフレームワー...
あじぇんだ
● パッケージングの今
● パッケージングの未来
● 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.p...
what's setup.py? (cont)
標準ライブラリ distutils
distutils.core.setup
拡張 setuptools/distribute
setuptools.setup
パッケージメタデータ 1.0
setup関数で作成
パッケージ名
バージョン
作成者、メンテナ
など
基本的な情報
egg-info
依存ライブラリ
プラグインのエントリポイントなど
拡張されたメタデータ
仮想環境の今の使い方
● virtualenvで仮想環境作成
○ virtualenvwrapperはそこそこ便利
● pipでパッケージインストール
$ mkvirtualenv some-project
(some-project) $ p...
helloコマンドの作成とパッケージング
$ mkvirtualenv hello
(hello) $ pip install pastescript
(hello) $ paster create hello
(hello) $ cd hel...
hello/__init__.py
def hello():
print "Hello, world!"
hello/__main__.py
from . import hello
if __name__ == '__main__':
hello()
(hello) $ python -m hello
Hello, world!
メタデータ
(hello) $ python setup.py egg_info
(hello) $ cat hello.egg-info/PKG-INFO
(hello) $ cat hello.egg-info/entry_points.t...
console_scripts
setup.py
entry_points="""
[console_scripts]
hello=hello:hello
"""
(hello) $ pip install -e .
(hello) $ hello
Hello, world!
パッケージング
(hello) $ python setup.py sdist
(hello) $ ls dist
hello-0.0dev.tar.gz
公開(without PyPI)
bitbucketなど用意
例えば https://bitbucket.org/aodag/python-hello
$ hg init
$ hg add setup.py setup.cfg hello/__...
リリース
リリースブランチ
$ hg branch rel-0.1
setup.cfg
;tag_build = dev ; コメントアウト
setup.py
version = "0.1"
リリース
$ hg commit
$ hg tag hello-0.1 # egg name
$ hg push --new-branch
https://bitbucket.org/aodag/python-
hello/get/hello-...
インストールしてみよう
$ mkvirtualenv hello2
(hello2) $ pip install https://bitbucket.
org/aodag/python-hello/get/hello-0.1.zip
(hell...
パッケージングの未来
現在の問題点
● eggは標準じゃない
● eggはpure pythonのパッケージでもプラット
フォーム、pythonバージョンごとに作成
● setup.py には実際のところなんでも書けてしま
う
● Linuxデ...
packaging
python3.3に入る予定だった
setuptoolsなどの成果を標準化することが期待さ
れていた
entry_pointやscriptsなどの拡張性について議論し
きれてなかった
実装もなかなか進まなかった
python...
パッケージインストールデータベース
PEP376
配布物に含まれるファイルを追記
どのインストーラ(pipやdpkg,rpmなど)がインストー
ルしたのか?
ユーザーが指定したのか、依存関係の結果インス
トールされたのか?
などを記録
wheelパッケージコンテナ PEP427
eggから発展
パッケージインストールデータベースに対応
より柔軟なプラットフォーム対応
きちんとPEPで議論済
メタデータ2.0 PEP426
egg-infoなどから、追加項目
依存ライブラリや提供パッケージなど。
setuptoolsとdistributeが合流
setuptoolsがあまりにも更新やバグフィックスが遅
い
distributeにフォーク
distributeで2to3やpython3対応などが進む
setuptools0.7でdistr...
pypa
setuptools, pip, virtualenvなどの実装、メンテナン
スをするグループ
http://github.com/pypa
http://bitbucket.org/pypa
distlib/distil
distlib
パッケージング関連のPEPを実装
distil
distlibの機能をpipにマージするための実験的実
装
distlibのサポートPEP
database PEP376
metadata 2.0, 1.2, 1.1 PEP345,314,241
version PEP386,426
Wheel PEP427
現在の状況
pip
pip1.4でwheelに対応
setuptools
setuptools0.8で2to3を必要としなくなった ->
wheelにできるようになる
virtualenv
setuptools0.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://bitbuc...
Don't think FEEL
$ pip install -U setuptools==0.8
$ pip install -U https://github.
com/pypa/pip/archive/1.4rc2.tar.gz
$ pi...
wheeling!
C拡張あり
$ pip wheel Pillow
$ ls wheelhouse
Pillow-2.1.0-cp33-cp33m-linux_x86_64.whl
C拡張なし
$ pip wheel webob
$ ls w...
use it!
インストールして使う
$ pip install wheelhouse/WebOb-1.2.3-py33-
none-any.whl
マウントして使う
import distlib.wheel
distlib.wheel.Whe...
Python3.4に期待すること
pipをインストールするスクリプトをバンドル
distlibを標準ライブラリにとりこみ
心配事について
ツールは変わる?
pipは続投されるはず
setuptoolsは一部の機能をdistlibに任せるように
なるはず
パッケージング方法は変わる?
bdist_wheelがメタデータ2.0をサポートすれば、現
在のsetup.py...
まとめ
パッケージングの情報は分散していてわかりにくい
今後のパッケージング方法はPython3主体
Python2の間はsetuptoolsがわかればOK
公開しない場合でもsetup.py書こう
Upcoming SlideShare
Loading in …5
×

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

5,762 views

Published on

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

  1. 1. パッケージングの今と未来 aodag
  2. 2. お前だれよ? aodag = Atsushi ODAGiri 株式会社ビープラウド勤務 Pylonsproject.jp Pythonサポーターズ PyCon APAC 2013 パトロン
  3. 3. お前だれよ?(cont) python1.5から! 文字列処理とか秘密の道具 Zope, TurboGears, Pylons/Paste/WSGI, Repoze, Pyramid! Django?なにそれ? PythonのWebフレームワークってどのくらいZope にするかってことだよね?
  4. 4. あじぇんだ ● パッケージングの今 ● パッケージングの未来 ● Python3.4に期待されること
  5. 5. ヽ(´_・ω・)_ こわくないよ
  6. 6. 現在のツール ● distribute ○ setup.py ○ pkg_resources ○ egg ● virtualenv ● pip
  7. 7. what's setup.py? 配布物を作る、PYPIに登録やアップロードする、配 布物をインストールする $ python setup.py test build sdist register upload $ python setup.py install
  8. 8. what's setup.py? (cont) 標準ライブラリ distutils distutils.core.setup 拡張 setuptools/distribute setuptools.setup
  9. 9. パッケージメタデータ 1.0 setup関数で作成 パッケージ名 バージョン 作成者、メンテナ など 基本的な情報
  10. 10. egg-info 依存ライブラリ プラグインのエントリポイントなど 拡張されたメタデータ
  11. 11. 仮想環境の今の使い方 ● virtualenvで仮想環境作成 ○ virtualenvwrapperはそこそこ便利 ● pipでパッケージインストール $ mkvirtualenv some-project (some-project) $ pip install pyramid (some-project) $ pip freeze
  12. 12. helloコマンドの作成とパッケージング $ mkvirtualenv hello (hello) $ pip install pastescript (hello) $ paster create hello (hello) $ cd hello (hello) $ pip freeze (hello) $ pip install -e . hello-0.0dev
  13. 13. hello/__init__.py def hello(): print "Hello, world!"
  14. 14. hello/__main__.py from . import hello if __name__ == '__main__': hello()
  15. 15. (hello) $ python -m hello Hello, world!
  16. 16. メタデータ (hello) $ python setup.py egg_info (hello) $ cat hello.egg-info/PKG-INFO (hello) $ cat hello.egg-info/entry_points.txt
  17. 17. console_scripts setup.py entry_points=""" [console_scripts] hello=hello:hello """
  18. 18. (hello) $ pip install -e . (hello) $ hello Hello, world!
  19. 19. パッケージング (hello) $ python setup.py sdist (hello) $ ls dist hello-0.0dev.tar.gz
  20. 20. 公開(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
  21. 21. リリース リリースブランチ $ hg branch rel-0.1 setup.cfg ;tag_build = dev ; コメントアウト setup.py version = "0.1"
  22. 22. リリース $ hg commit $ hg tag hello-0.1 # egg name $ hg push --new-branch https://bitbucket.org/aodag/python- hello/get/hello-0.1.zip
  23. 23. インストールしてみよう $ mkvirtualenv hello2 (hello2) $ pip install https://bitbucket. org/aodag/python-hello/get/hello-0.1.zip (hello2) $ pip freeze
  24. 24. パッケージングの未来 現在の問題点 ● eggは標準じゃない ● eggはpure pythonのパッケージでもプラット フォーム、pythonバージョンごとに作成 ● setup.py には実際のところなんでも書けてしま う ● Linuxディストリビューションなどのパッケージ管 理と競合する
  25. 25. packaging python3.3に入る予定だった setuptoolsなどの成果を標準化することが期待さ れていた entry_pointやscriptsなどの拡張性について議論し きれてなかった 実装もなかなか進まなかった python3.3からdrop
  26. 26. パッケージインストールデータベース PEP376 配布物に含まれるファイルを追記 どのインストーラ(pipやdpkg,rpmなど)がインストー ルしたのか? ユーザーが指定したのか、依存関係の結果インス トールされたのか? などを記録
  27. 27. wheelパッケージコンテナ PEP427 eggから発展 パッケージインストールデータベースに対応 より柔軟なプラットフォーム対応 きちんとPEPで議論済
  28. 28. メタデータ2.0 PEP426 egg-infoなどから、追加項目 依存ライブラリや提供パッケージなど。
  29. 29. setuptoolsとdistributeが合流 setuptoolsがあまりにも更新やバグフィックスが遅 い distributeにフォーク distributeで2to3やpython3対応などが進む setuptools0.7でdistributeが合流、成果をマージ distribute0.7はsetuptools0.7以降へのアップグ レード用
  30. 30. pypa setuptools, pip, virtualenvなどの実装、メンテナン スをするグループ http://github.com/pypa http://bitbucket.org/pypa
  31. 31. distlib/distil distlib パッケージング関連のPEPを実装 distil distlibの機能をpipにマージするための実験的実 装
  32. 32. distlibのサポートPEP database PEP376 metadata 2.0, 1.2, 1.1 PEP345,314,241 version PEP386,426 Wheel PEP427
  33. 33. 現在の状況 pip pip1.4でwheelに対応 setuptools setuptools0.8で2to3を必要としなくなった -> wheelにできるようになる virtualenv setuptools0.7以降に対応
  34. 34. 残る問題 メタデータ2.0 distlibはメタデータ2.0をサポートしているが pypackage.jsonを書かないといけない bdist_wheelはsetup.pyからメタデータを生成する が、対応しているのはメタデータ1.0
  35. 35. pyvenv virtualenvの機能をPython標準にとりこみ Python3.3以降で利用可能 virtualenvが標準ライブラリをコピーするのに対し て、pyvenvはsite.pyの入れ替えのみで対応
  36. 36. 未来を感じてみよう 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
  37. 37. 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 準備完了
  38. 38. wheeling! C拡張あり $ pip wheel Pillow $ ls wheelhouse Pillow-2.1.0-cp33-cp33m-linux_x86_64.whl C拡張なし $ pip wheel webob $ ls wheelhouse WebOb-1.2.3-py33-none-any.whl
  39. 39. use it! インストールして使う $ pip install wheelhouse/WebOb-1.2.3-py33- none-any.whl マウントして使う import distlib.wheel distlib.wheel.Wheel('wheelhouse/Pillow-2.1.0- cp33-cp33m-linux_x86_64.whl') import PIL
  40. 40. Python3.4に期待すること pipをインストールするスクリプトをバンドル distlibを標準ライブラリにとりこみ
  41. 41. 心配事について ツールは変わる? pipは続投されるはず setuptoolsは一部の機能をdistlibに任せるように なるはず パッケージング方法は変わる? bdist_wheelがメタデータ2.0をサポートすれば、現 在のsetup.py方式のままいけるはず
  42. 42. まとめ パッケージングの情報は分散していてわかりにくい 今後のパッケージング方法はPython3主体 Python2の間はsetuptoolsがわかればOK 公開しない場合でもsetup.py書こう

×