パッケージングの今

13,335 views

Published on

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,335
On SlideShare
0
From Embeds
0
Number of Embeds
10,643
Actions
Shares
0
Downloads
17
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

パッケージングの今

  1. 1. パッケージングの今 aodag September 15, 2014
  2. 2. お前誰よ I aodag I Atsushi ODAGiri I 所属 I ビープラウド I Pylonsproject.jp
  3. 3. 今日のsetuptools のバージョンいくつよ? I 1.1.5 2013-09-12 I 2.0 2013-12-08 I 5.7 2013-08-15
  4. 4. アジェンダ I パッケージを使う I パッケージを作る I パッケージをもっと活用する
  5. 5. パッケージを使う I pypi I pip I virtualenv
  6. 6. PyPI I cheeseshop I warehouse I https://warehouse.python.org/ I https://warehouse.python.org/project/WebDispatch/ I https://warehouse.python.org/user/aodag/
  7. 7. PIP I “–pre” オプション I デフォルトではプリバージョン(a やb などついてるバー ジョン) のものはインストール対象外 I “–allow-external” “–allow-unverified” オプション I インデックスサーバー(PyPI) にホスティングされていない ファイルのインストールが厳しくなった I wheel サポート I wheel 形式のパッケージをインストールできる I pip, setuptools 自体もwheel 形式で配布 I get-pip.py I setuptools, pip をインストールするもの I さよならez_setup.py!
  8. 8. ensure pip I PEP 453 Explicit bootstrapping of pip in Python installations I Python3.4 以降ではインストール直後からpip を利用可能 I get-pip.py もいらない I PEP 477 Backport ensurepip (PEP 453) to Python 2.7 I Python2.7 でもインストール直後にpip を使えるようにしよう I Status:Accepted I 今後に期待
  9. 9. PIP でパッケージをインストール I PyPI からインストール pip install pyramid I ローカルサーバーからインストール pip install pyramid -f http://localhost:5000 I requirements ファイルでインストール "export code"body $ pip install -r requirements.txt
  10. 10. requirements.txt I 単純にパッケージを指定 pyramid==1.5.1 sqlalchemh==0.9.2 I リポジトリを指定 git+https://github.com/aodag/WebDispatch.git
  11. 11. requirements.txt I オプションを追加 --no-index -f http://localhost:8080/dists I 他のrequirements.txt をインクルード -r requirements.txt
  12. 12. wheel I wheel とは I パッケージの配布形式 I コンパイル済みのC 拡張などを含む I sdist と比べて容量が小さい I インストールが早い
  13. 13. pip でwheel を作る I wheel パッケージが必要 pip install wheel I pip wheel コマンド pip wheel pyramid wheelhouse ディレクトリに依存ライブラリまで含めて、 wheel フォーマットで保存される
  14. 14. pip でwheel をインストールする pip install -f wheelhouse pyramid-1.5.1-py2.py3-none-any.whl I “–find-links”(“-f”) オプションでwheelhouse ディレクトリを 指定するとそのディレクトリからインストールされる I “–no-index” オプションも併用するとローカルだけで依存ラ イブラリのインストールが完了する
  15. 15. パッケージを作る
  16. 16. setup.py, setuptools I setuptools I 今のところパッケージングするための必須ツール I get-pip.py でpip のついでにインストールされる I setup.py I パッケージのメタデータなどを記述する I 内部ではsetuptools やdistutils などのsetup 関数を呼ぶだけ
  17. 17. setup.py に書くべきこと from setuptools import setup __author__ = 'Atsushi Odagiri <aodagx@gmail.com>' __version__ = '0.0' requires = [ ] setup( name="aodag.hello", version=__version__, author=__author__, author_email="aodagx@gmail.com", description="sample package", packages=["aodag.hello"], namespace_packages=["aodag"],
  18. 18. setup.py に書くべきこと long_description=""" aodag.hello ================== sample package """, install_requires=requires, url="http://example.com/aodag.hello" )
  19. 19. パッケージをもっと活用する I パッケージを公開する I パッケージを限定的に公開する I CI やデプロイで活用する
  20. 20. パッケージの公開方法 I pypi python setup.py register python setup.py sdist bdist_wheel upload I setuptools の機能でアップロードする I setuptools なしでもアップロードできるようにtwine という コマンドが開発されている I github,bitbucket git tag v0.0 git push --tags pip install -f https://github.com/aodag/aodag.hello/archive/v0.0.zip I タグをつけてリリースURL からインストール I ローカルPyPI I devpi などを立ててそこに公開
  21. 21. devpi I 機能 I ローカルに立てられるパッケージインデックスサーバー I PyPI へのプロキシとキャッシュ I devpi へのアップロード I プロジェクトごとの名前空間 I インストール pip install devpi
  22. 22. devpi をプロキシとして使う I devpi-server devpi-server --start I index-server にdevpi を使う pip install -i http://localhost:3141/root/pypi/+simple/ WebDispatch
  23. 23. devpi にアップロードするための準備 I ユーザーを作成 $ devpi user -c aodag password= user created: aodag $ devpi login aodag --password= logged in 'aodag', credentials valid for 10.00 hours I プロジェクト用のインデックスを作る $ devpi index -c aodag.hello http://localhost:3141/aodag/aodag.hello: type=stage bases=root/pypi volatile=True uploadtrigger_jenkins=None acl_upload=aodag pypi_whitelist=
  24. 24. devpi にアップロード devpi use aodag.hello devpi upload --formats "sdist,bdist_wheel" I devpi use でインデックスサーバーを指定 I devpi upload でアップロード I “–formats” オプションでアップロードするパッケージフォー マットを指定
  25. 25. devpi のプロジェクト用インデックスサーバーからイン ストール $ pip install -i http://localhost:3141/aodag/aodag.hello/+simplee/ Downloading/unpacking aodag.hello http://localhost:3141/aodag/aodag.hello/+simple/aodag.hello/ https if localhost:3141 has it available Downloading aodag.hello-0.0-py2.py3-none-any.whl Installing collected packages: aodag.hello Successfully installed aodag.hello Cleaning up...
  26. 26. devpi 用のrequirements.txt を作る I requirements.txt に依存パッケージを書く I dev-requirements.txt でインデックスサーバーを指定して、 requirements.txt を参照する I requirements.txt aodag.hello==0.0 I dev-requirements.txt -i http://localhost:3141/aodag/aodag.hello/+simple -r requirements.txt
  27. 27. CI やデプロイに活用する I CI のおともに I travis-ci などでテストするときに毎回依存ライブラリのダウ ンロードするのは効率が悪い I pip wheel しておいてwheelhouse まるごとVCS に入れてしま う(ベンダリング) I デプロイするときに I devpi サーバーなどをLAN にたてておけば不意のPyPI サー バーダウンでもなんとかなるかもしれない(キャッシュされ てないものは無理) I wheel をベンダリングして丸ごとデプロイしてしまうのが安 全だし早い
  28. 28. CI で使うrequirements.txt I requirements.txt に依存ライブラリを書く I tests-require.txt にテストのときだけ必要な依存ライブラリを 書く I dev-requires.txt にインデックスサーバーオプションなどを 書く I tox などで依存先に“-rdev-requires.txt” などを指定する -f wheelhouse --no-index -r requirements.txt -r tests-requires.txt
  29. 29. devpi かwheel をベンダリングするか I ベンダリングすると依存ライブラリの取得にネットワークを 必要としない I テストで利用したのと同じライブラリであることが保証さ れる I wheel フォーマットでPyPI に登録されていないものでも、 pip wheel コマンドでwheel 化したものを使える I devpi でもwheel 化したものをプロジェクト用にアップロー ドしておけばよい I devpi では独自パッチをあてたサードパーティ製ライブラリ をindex-server で入れ替えておけるのでrequirements.txt で 個別のURL を指定しなくてもよい
  30. 30. まとめ I パッケージを使う I pip が細かく進化している I パッケージを作る I まだまだsetuptools が現役 I パッケージを活用する I wheel をうまく利用すると、CI やデプロイを効率化できる かも
  31. 31. 参考 I Python Packaging User Guide I https://packaging.python.org/en/latest/ I PEP 453 – Explicit bootstrapping of pip in Python installations I http://legacy.python.org/dev/peps/pep-0453/ I PEP 427 – The Wheel Binary Package Format 1.0 I http://legacy.python.org/dev/peps/pep-0427/ I devpi: PyPI server and packaging/testing/release tool I http://doc.devpi.net/latest/ I pip I https://pip.pypa.io/en/latest/ I Wheel I http://wheel.readthedocs.org/en/latest/ I CheeseShop Tutorial I https://wiki.python.org/moin/CheeseShopTutorial I Warehouse I https://warehouse.python.org/

×