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

Post on 24-May-2015

6.849 views 1 download

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

パッケージングの

今と未来

aodag - Atsushi OdagiriPyCon APAC 2013

お前誰よ

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

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

Agenda

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

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

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

Pythonでのパッケージング

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

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

素朴な方法

hello.pyを渡して

python hello.py

distutils

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

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

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

パッケージングの今

Pypaツール群

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

Pythonパッケージ開発の流れ

Pypa Python Packaging Authority

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

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

github pip virtualenvbitbucket setuptools pypi distlib

モダンなPythonの環境作り

Pypaツール群

● virtualenv● setuptools● pip

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

pip

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

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

pip install パッケージ名

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

pip

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

pip install -r requrements.txt

パッケージを削除

pip uninstall spam

pip

easy_installとはなんだったのか?

setuptools/distribute

setup.pyを強化

配布するまでのコマンド

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

setuptools/distribute

pkg_resources

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

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

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

setuptools

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

setuptools

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

setuptools/distribute

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

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

setuptools/distribute

entry_pointプラグインの仕組み

CUIコマンドを作る例

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

entry_point活用例

PasteDeploynosecliffsetuptoolsのサブコマンド

egg

バイナリパッケージ

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

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

PIPでは扱えない

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

PyPI

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

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

pip,setuptools,virtualenvでの開発

仮想環境作成と利用

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

pip,setuptools,virtualenvでの開発

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

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

最小限のsetup.py

from setuptools import setup, find_packages

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

実用的なsetup.py

from setuptools import setup, find_packages

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

pip,setuptools,virtualenvでの開発

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

(Editable Install)

pip install -e .

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

extras_requireを活用する

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

extras_requireを活用する

extrasを指定してEditable Install

pip install -e .[dev]

setup.cfg

devパッケージ

[egg_info]tag-build = dev

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

setup.cfg

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

[upload_docs]upload_dir = docs/build/html

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

setup.cfg

コマンドを追加(alias)

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

python setup.py release source

パッケージングの未来

関連PEPwheeldistlibMetadata 2.0

pip

インストーラー

easy_installsetup.py install

distutils

パッケージャー

setuptools/distribute

パッケージフォーマット

sdist

eggMetadata1.0

wheelMetadata2.0

?

pkg_resources(setuptools)

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

distlib

今 未来

関連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

Wheel

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

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

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

distlib

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

Metadata 2.0 pydist.json

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

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

pkg_resourcesからdistlibへ

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

setuptoolsのwheel対応

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

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

pipのwheel対応

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

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

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

Wheelをどう使うか?

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

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

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

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

開発マシン

パッケージサーバー

ステージングサーバー

プロダクションサーバー

リポジトリ

CIサーバー

ソースコード

sdist

wheel

requirements.txtwheel

議論中の話題

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

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

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

まとめ

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

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

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