Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

パッケージングの今

17,981 views

Published on

  • Be the first to comment

パッケージングの今

  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/

×