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

9,266 views

Published on

Published in: Technology

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

  1. 1. パッケージングの 今と未来 aodag - Atsushi Odagiri PyCon APAC 2013
  2. 2. お前誰よ aodag 小田切篤 Atsushi Odagiri Be Proud, Inc. pylonsproject.jp Pythonは10年ほど使わせていただいております
  3. 3. Agenda パッケージングの基礎知識 パッケージングの今 パッケージングの未来 まとめ
  4. 4. パッケージングの基礎知識 なぜパッケージングするのか? Pythonでのパッケージング
  5. 5. なぜパッケージングするのか? ● 作ったものを誰かに使ってもらう ● 誰かが作ったものを使う
  6. 6. 素朴な方法 hello.pyを渡して python hello.py
  7. 7. distutils setup.pyにパッケージ情報を書く python setup.py sdist でソースパッケージ作成 python setup.py install でパッケージインストール
  8. 8. パッケージングの今 Pypaツール群 setuptoolsベースのパッケージング Pythonパッケージ開発の流れ
  9. 9. Pypa Python Packaging Authority パッケージング関連の重要なツールをメンテナンス する非公式なグループ なぜかリポジトリがgithubとbitbucketにわかれてい る github pip virtualenv bitbucket setuptools pypi distlib
  10. 10. モダンなPythonの環境作り Pypaツール群 ● virtualenv ● setuptools ● pip virtualenvは環境作成時にsetuptools,pipがそ ろった環境にしてくれる
  11. 11. pip パッケージインストーラー sdistしか扱えない(状態が続いていた) さまざまなロケーションからインストール pip install パッケージ名 pip install パッケージURL pip install vcs{git,hg..}+リポジトリURL@チェンジ セット
  12. 12. pip requirements.txtにパッケージを全部指定 pip install -r requrements.txt パッケージを削除 pip uninstall spam
  13. 13. pip easy_installとは なんだったのか?
  14. 14. setuptools/distribute setup.pyを強化 配布するまでのコマンド setup.py test setup.py register setup.py sdist bdist_egg upload setup.py upload_docs
  15. 15. setuptools/distribute pkg_resources ● パッケージのメタデータを利用するためのライブ ラリ ● パッケージに含まれるメディアデータの取得など ● entry_point(後述)のローディングなども行える
  16. 16. setuptools/distribute setuptoolsとdistributeの関係 setuptoolsがあまり更新などしない distributeがフォーク distributeがpy3対応などいろいろ 2013 PyCon USでマージ宣言 Pypaがメンテする distributeコードベースでsetuptools-0.7など setuptools-0.8,0.9,0.9.1...0.9.8,1.0,1.1,1.1.5
  17. 17. setuptools distributeのことは 忘れてあげてください
  18. 18. setuptools マージ後のsetuptoolsは バージョンあげすぎです><
  19. 19. setuptools/distribute packages=find_packages() packagesに自分でパッケージを羅列しなくてもよい install_requires, tests_require, extras_require, setup_require ライブラリの依存性を指定
  20. 20. setuptools/distribute entry_point プラグインの仕組み CUIコマンドを作る例 entry_point={ “console_scripts”: [ “hello=hello:greeting”, ], }
  21. 21. entry_point活用例 PasteDeploy nose cliff setuptoolsのサブコマンド
  22. 22. egg バイナリパッケージ C拡張などのコンパイル済ライブラリなどを含める ソースとメタデータをzipアーカイブしたもの PIPでは扱えない
  23. 23. egg-info pyramid-1.5a1-py33.egg-infoの例 ● PKG-INFO ● SOURCES.txt ● dependency_links.txt ● entry_points.txt ● not-zip-safe ● requires.txt ● top_level.txt
  24. 24. PyPI パッケージを登録して配布するサイト pipやeasy_installはデフォルトで、PyPIにパッケー ジを探しに行く
  25. 25. pip,setuptools,virtualenvでの開発 仮想環境作成と利用 mkdir yourproject cd yourproject virtualenv env . env/bin/activate or env/scripts/activate.ps1
  26. 26. pip,setuptools,virtualenvでの開発 プロジェクトのディレクトリ構成 yourproject/ ┣ env/ ┣ setup.py ┣ setup.cfg ┣ docs/ ┗yourproject/__init__.py ┗main.py
  27. 27. 最小限のsetup.py from setuptools import setup, find_packages setup(name=”yourproject”, packages=find_packages(), )
  28. 28. 実用的なsetup.py from setuptools import setup, find_packages setup(name=”yourproject”, packages=find_packages(), install_requires=[“webob”], tests_require=[“testfixtures”], test_suite=”yourproject”, )
  29. 29. pip,setuptools,virtualenvでの開発 開発対象のegg登録と依存ライブラリインストール (Editable Install) pip install -e .
  30. 30. pip,setuptools,virtualenvでの開発 テストから、PyPIへのアップロード、PythonHosted へのドキュメントアップロード python setup.py test python setup.py egg_info python setup.py check python setup.py register python setup.py sdist bdist_egg upload python setup.py build_sphinx python setup.py upload_docs
  31. 31. extras_requireを活用する setup( … extras_require={ “testing”: tests_require, “docs”: docs_require, “dev”: tests_require + docs_require, } )
  32. 32. extras_requireを活用する extrasを指定してEditable Install pip install -e .[dev]
  33. 33. setup.cfg devパッケージ [egg_info] tag-build = dev sdistやbdist_eggなどで生成されるパッケージの バージョンの後にdevが付加される
  34. 34. setup.cfg コマンドのオプションを指定 [upload_docs] upload_dir = docs/build/html python setup.py upload_docs で自動でオプショ ン追加
  35. 35. setup.cfg コマンドを追加(alias) [aliases] release = egg_info -RDb '' source = register sdist binary binary = bdist_egg upload --show-response python setup.py release source
  36. 36. パッケージングの未来 関連PEP wheel distlib Metadata 2.0
  37. 37. pip インストーラー easy_installsetup.py install distutils パッケージャー setuptools/distribute パッケージフォーマット sdist egg Metadata1.0 wheel Metadata2.0 ? pkg_resources(setuptools) ユーティリティモジュール distlib 今 未来
  38. 38. 関連PEP PEP 345 -- Metadata 1.2 PEP 376 -- Database PEP 386 -- Version PEP 420 -- Namespace Package PEP 426 -- Metadata 2.0 PEP 427 -- Wheel PEP 440 -- Version PEP 453 -- Bundle PIP Installer
  39. 39. Wheel ● バイナリパッケージフォーマット ● Metadata 2.0を含むzip ● 電子署名可能 ● bdist_wheelやegg2wheel, distlib.wheelなど で作成 ● C拡張などを含まない場合はpy2,py3両用のユ ニバーサル構成可能 ● 既にpipもサポート開始 ● PyPIは?
  40. 40. distlib ● 関連PEPの実装ライブラリ ● PyPIへのアクセスAPI ● パッケージ同梱のメディアファイルへのアクセス ● Scriptsのインストール ● 機能検証用にdistilというコマンドがある
  41. 41. Metadata 2.0 pydist.json ● egg-infoでばらばらだった項目(requires, entry_point)とMetadata1.0(PKG-INFO)を統合 ● josnフォーマット ● wheelの dist-info に配置する
  42. 42. pkg_resourcesからdistlibへ ● だいたい同じことができる ● entry_pointとexportsで非互換性がある
  43. 43. setuptoolsのwheel対応 setuptools自体はdistlibもwheelも対応していない wheelをインストールすると、setupにbdist_wheel コマンドが追加される
  44. 44. pipのwheel対応 ● distlibを同梱して、wheelパッケージをインス トール可能 ● sdistに対してbdist_wheelする実装が既に取り 込まれている(インストールはしない) ● 直接sdistをインストールする場合は bdist_egg が実行される
  45. 45. Wheelをどう使うか? 例:Webアプリケーションのデプロイ アプリサーバーにgccがない!Pillowをどうインス トールするか? wheelで作成してアプリケーションサーバーに配布 する。 pipでwheelをインストール(pipはeggパッケージを 取り扱えない)
  46. 46. 開発マシン パッケージサーバー ステージングサーバー プロダクションサーバー リポジトリ CIサーバー ソースコード sdist wheel requirements.txt wheel
  47. 47. 議論中の話題 ● sdistをインストールする際に、setup.py bdist_eggは必須か? ● パッケージャーがwheelを作成するのをサポート するツールは? ○ bdist_wheelはsetuptoolsとwheelが必要 ○ sdist.wheelはpydist.jsonを自分で書く ○ bentoは独自形式のmetadataファイルから変換する ● 各Linuxディストリビューションの反応、作業はど のようになるか?
  48. 48. まとめ ● 今はsetuptoolsの使い方とsetup.pyの書き方を ちゃんと覚えよう ● pipはがんばってpepに追従しているので今後も 安泰に見える ● setuptoolsはいい加減にしてほしい ● wheelはデプロイで活用できるかも
  49. 49. 参考文献 ● Distributing Python Modules ● Python Packaging User Guide ● Wheel ● distlib ● setuptools ● pip ● Bento ● pypa bitbucket ● pypa github

×