「未来の教室」プラットフォーム これまでの取組と今後の展望...「未来の教室」プラットフォーム これまでの取組と今後の展望 経済産業省
パッケージングの今と未来
-
Upload
atsushi-odagiri -
Category
Technology
-
view
6.849 -
download
1
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はデプロイで活用できるかも
参考文献
● Distributing Python Modules● Python Packaging User Guide● Wheel● distlib● setuptools● pip● Bento● pypa bitbucket● pypa github