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

49
パッケージングの 今と未来 aodag - Atsushi Odagiri PyCon APAC 2013

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

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

パッケージングの

今と未来

aodag - Atsushi OdagiriPyCon APAC 2013

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

お前誰よ

aodag 小田切篤 Atsushi OdagiriBe Proud, Inc.pylonsproject.jp

Pythonは10年ほど使わせていただいております

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

Agenda

パッケージングの基礎知識パッケージングの今パッケージングの未来まとめ

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

パッケージングの基礎知識

なぜパッケージングするのか?

Pythonでのパッケージング

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

なぜパッケージングするのか?

● 作ったものを誰かに使ってもらう● 誰かが作ったものを使う

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

素朴な方法

hello.pyを渡して

python hello.py

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

distutils

setup.pyにパッケージ情報を書く

python setup.py sdist でソースパッケージ作成

python setup.py install でパッケージインストール

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

パッケージングの今

Pypaツール群

setuptoolsベースのパッケージング

Pythonパッケージ開発の流れ

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

Pypa Python Packaging Authority

パッケージング関連の重要なツールをメンテナンスする非公式なグループ

なぜかリポジトリがgithubとbitbucketにわかれている

github pip virtualenvbitbucket setuptools pypi distlib

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

モダンなPythonの環境作り

Pypaツール群

● virtualenv● setuptools● pip

virtualenvは環境作成時にsetuptools,pipがそろった環境にしてくれる

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

pip

パッケージインストーラー

sdistしか扱えない(状態が続いていた)さまざまなロケーションからインストール

pip install パッケージ名

pip install パッケージURLpip install vcs{git,hg..}+リポジトリURL@チェンジセット

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

pip

requirements.txtにパッケージを全部指定

pip install -r requrements.txt

パッケージを削除

pip uninstall spam

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

pip

easy_installとはなんだったのか?

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

setuptools/distribute

setup.pyを強化

配布するまでのコマンド

setup.py testsetup.py registersetup.py sdist bdist_egg uploadsetup.py upload_docs

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

setuptools/distribute

pkg_resources

● パッケージのメタデータを利用するためのライブラリ

● パッケージに含まれるメディアデータの取得など● entry_point(後述)のローディングなども行える

Page 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

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

setuptools

distributeのことは忘れてあげてください

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

setuptools

マージ後のsetuptoolsはバージョンあげすぎです><

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

setuptools/distribute

packages=find_packages()packagesに自分でパッケージを羅列しなくてもよい

install_requires, tests_require, extras_require, setup_requireライブラリの依存性を指定

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

setuptools/distribute

entry_pointプラグインの仕組み

CUIコマンドを作る例

entry_point={ “console_scripts”: [ “hello=hello:greeting”, ],}

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

entry_point活用例

PasteDeploynosecliffsetuptoolsのサブコマンド

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

egg

バイナリパッケージ

C拡張などのコンパイル済ライブラリなどを含める

ソースとメタデータをzipアーカイブしたもの

PIPでは扱えない

Page 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

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

PyPI

パッケージを登録して配布するサイト

pipやeasy_installはデフォルトで、PyPIにパッケージを探しに行く

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

pip,setuptools,virtualenvでの開発

仮想環境作成と利用

mkdir yourprojectcd yourprojectvirtualenv env. env/bin/activate or env/scripts/activate.ps1

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

pip,setuptools,virtualenvでの開発

プロジェクトのディレクトリ構成

yourproject/ ┣ env/ ┣ setup.py ┣ setup.cfg ┣ docs/ ┗yourproject/__init__.py ┗main.py

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

最小限のsetup.py

from setuptools import setup, find_packages

setup(name=”yourproject”, packages=find_packages(),)

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

実用的なsetup.py

from setuptools import setup, find_packages

setup(name=”yourproject”, packages=find_packages(), install_requires=[“webob”], tests_require=[“testfixtures”], test_suite=”yourproject”,)

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

pip,setuptools,virtualenvでの開発

開発対象のegg登録と依存ライブラリインストール

(Editable Install)

pip install -e .

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

pip,setuptools,virtualenvでの開発

テストから、PyPIへのアップロード、PythonHostedへのドキュメントアップロード

python setup.py testpython setup.py egg_infopython setup.py checkpython setup.py registerpython setup.py sdist bdist_egg uploadpython setup.py build_sphinxpython setup.py upload_docs

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

extras_requireを活用する

setup( … extras_require={ “testing”: tests_require, “docs”: docs_require, “dev”: tests_require + docs_require, })

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

extras_requireを活用する

extrasを指定してEditable Install

pip install -e .[dev]

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

setup.cfg

devパッケージ

[egg_info]tag-build = dev

sdistやbdist_eggなどで生成されるパッケージのバージョンの後にdevが付加される

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

setup.cfg

コマンドのオプションを指定

[upload_docs]upload_dir = docs/build/html

python setup.py upload_docs で自動でオプション追加

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

setup.cfg

コマンドを追加(alias)

[aliases]release = egg_info -RDb ''source = register sdist binarybinary = bdist_egg upload --show-response

python setup.py release source

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

パッケージングの未来

関連PEPwheeldistlibMetadata 2.0

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

pip

インストーラー

easy_installsetup.py install

distutils

パッケージャー

setuptools/distribute

パッケージフォーマット

sdist

eggMetadata1.0

wheelMetadata2.0

?

pkg_resources(setuptools)

ユーティリティモジュール

distlib

今 未来

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

関連PEP

PEP 345 -- Metadata 1.2PEP 376 -- DatabasePEP 386 -- VersionPEP 420 -- Namespace PackagePEP 426 -- Metadata 2.0PEP 427 -- WheelPEP 440 -- VersionPEP 453 -- Bundle PIP Installer

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

Wheel

● バイナリパッケージフォーマット● Metadata 2.0を含むzip● 電子署名可能● bdist_wheelやegg2wheel, distlib.wheelなど

で作成● C拡張などを含まない場合はpy2,py3両用のユ

ニバーサル構成可能● 既にpipもサポート開始● PyPIは?

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

distlib

● 関連PEPの実装ライブラリ● PyPIへのアクセスAPI● パッケージ同梱のメディアファイルへのアクセス● Scriptsのインストール● 機能検証用にdistilというコマンドがある

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

Metadata 2.0 pydist.json

● egg-infoでばらばらだった項目(requires,entry_point)とMetadata1.0(PKG-INFO)を統合

● josnフォーマット● wheelの dist-info に配置する

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

pkg_resourcesからdistlibへ

● だいたい同じことができる● entry_pointとexportsで非互換性がある

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

setuptoolsのwheel対応

setuptools自体はdistlibもwheelも対応していない

wheelをインストールすると、setupにbdist_wheelコマンドが追加される

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

pipのwheel対応

● distlibを同梱して、wheelパッケージをインストール可能

● sdistに対してbdist_wheelする実装が既に取り込まれている(インストールはしない)

● 直接sdistをインストールする場合は bdist_egg が実行される

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

Wheelをどう使うか?

例:Webアプリケーションのデプロイ

アプリサーバーにgccがない!Pillowをどうインストールするか?

wheelで作成してアプリケーションサーバーに配布する。

pipでwheelをインストール(pipはeggパッケージを取り扱えない)

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

開発マシン

パッケージサーバー

ステージングサーバー

プロダクションサーバー

リポジトリ

CIサーバー

ソースコード

sdist

wheel

requirements.txtwheel

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

議論中の話題

● sdistをインストールする際に、setup.py bdist_eggは必須か?

● パッケージャーがwheelを作成するのをサポートするツールは?○ bdist_wheelはsetuptoolsとwheelが必要○ sdist.wheelはpydist.jsonを自分で書く○ bentoは独自形式のmetadataファイルから変換する

● 各Linuxディストリビューションの反応、作業はどのようになるか?

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

まとめ

● 今はsetuptoolsの使い方とsetup.pyの書き方をちゃんと覚えよう

● pipはがんばってpepに追従しているので今後も安泰に見える

● setuptoolsはいい加減にしてほしい● wheelはデプロイで活用できるかも