SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
パッケージングの今 
aodag 
September 15, 2014
お前誰よ 
I aodag 
I Atsushi ODAGiri 
I 所属 
I ビープラウド 
I Pylonsproject.jp
今日のsetuptools のバージョンいくつよ? 
I 1.1.5 2013-09-12 
I 2.0 2013-12-08 
I 5.7 2013-08-15
アジェンダ 
I パッケージを使う 
I パッケージを作る 
I パッケージをもっと活用する
パッケージを使う 
I pypi 
I pip 
I virtualenv
PyPI 
I cheeseshop 
I warehouse 
I https://warehouse.python.org/ 
I https://warehouse.python.org/project/WebDispatch/ 
I https://warehouse.python.org/user/aodag/
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!
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 今後に期待
PIP でパッケージをインストール 
I PyPI からインストール 
pip install pyramid 
I ローカルサーバーからインストール 
pip install pyramid -f http://localhost:5000 
I requirements ファイルでインストール 
"export code"body 
$ pip install -r requirements.txt
requirements.txt 
I 単純にパッケージを指定 
pyramid==1.5.1 
sqlalchemh==0.9.2 
I リポジトリを指定 
git+https://github.com/aodag/WebDispatch.git
requirements.txt 
I オプションを追加 
--no-index 
-f http://localhost:8080/dists 
I 他のrequirements.txt をインクルード 
-r requirements.txt
wheel 
I wheel とは 
I パッケージの配布形式 
I コンパイル済みのC 拡張などを含む 
I sdist と比べて容量が小さい 
I インストールが早い
pip でwheel を作る 
I wheel パッケージが必要 
pip install wheel 
I pip wheel コマンド 
pip wheel pyramid 
wheelhouse ディレクトリに依存ライブラリまで含めて、 
wheel フォーマットで保存される
pip でwheel をインストールする 
pip install -f wheelhouse  
pyramid-1.5.1-py2.py3-none-any.whl 
I “–find-links”(“-f”) オプションでwheelhouse ディレクトリを 
指定するとそのディレクトリからインストールされる 
I “–no-index” オプションも併用するとローカルだけで依存ラ 
イブラリのインストールが完了する
パッケージを作る
setup.py, setuptools 
I setuptools 
I 今のところパッケージングするための必須ツール 
I get-pip.py でpip のついでにインストールされる 
I setup.py 
I パッケージのメタデータなどを記述する 
I 内部ではsetuptools やdistutils などのsetup 関数を呼ぶだけ
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"],
setup.py に書くべきこと 
long_description=""" 
aodag.hello 
================== 
sample package 
""", 
install_requires=requires, 
url="http://example.com/aodag.hello" 
)
パッケージをもっと活用する 
I パッケージを公開する 
I パッケージを限定的に公開する 
I CI やデプロイで活用する
パッケージの公開方法 
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 などを立ててそこに公開
devpi 
I 機能 
I ローカルに立てられるパッケージインデックスサーバー 
I PyPI へのプロキシとキャッシュ 
I devpi へのアップロード 
I プロジェクトごとの名前空間 
I インストール 
pip install devpi
devpi をプロキシとして使う 
I devpi-server 
devpi-server --start 
I index-server にdevpi を使う 
pip install  
-i http://localhost:3141/root/pypi/+simple/  
WebDispatch
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=
devpi にアップロード 
devpi use aodag.hello 
devpi upload --formats "sdist,bdist_wheel" 
I devpi use でインデックスサーバーを指定 
I devpi upload でアップロード 
I “–formats” オプションでアップロードするパッケージフォー 
マットを指定
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...
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
CI やデプロイに活用する 
I CI のおともに 
I travis-ci などでテストするときに毎回依存ライブラリのダウ 
ンロードするのは効率が悪い 
I pip wheel しておいてwheelhouse まるごとVCS に入れてしま 
う(ベンダリング) 
I デプロイするときに 
I devpi サーバーなどをLAN にたてておけば不意のPyPI サー 
バーダウンでもなんとかなるかもしれない(キャッシュされ 
てないものは無理) 
I wheel をベンダリングして丸ごとデプロイしてしまうのが安 
全だし早い
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
devpi かwheel をベンダリングするか 
I ベンダリングすると依存ライブラリの取得にネットワークを 
必要としない 
I テストで利用したのと同じライブラリであることが保証さ 
れる 
I wheel フォーマットでPyPI に登録されていないものでも、 
pip wheel コマンドでwheel 化したものを使える 
I devpi でもwheel 化したものをプロジェクト用にアップロー 
ドしておけばよい 
I devpi では独自パッチをあてたサードパーティ製ライブラリ 
をindex-server で入れ替えておけるのでrequirements.txt で 
個別のURL を指定しなくてもよい
まとめ 
I パッケージを使う 
I pip が細かく進化している 
I パッケージを作る 
I まだまだsetuptools が現役 
I パッケージを活用する 
I wheel をうまく利用すると、CI やデプロイを効率化できる 
かも
参考 
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/

Más contenido relacionado

La actualidad más candente

Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonYasunori Horikoshi
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来Atsushi Odagiri
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テストryohji ikebe
 
Distutil setuptools distribute
Distutil setuptools distributeDistutil setuptools distribute
Distutil setuptools distributeAtsushi Odagiri
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テストryohji ikebe
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)泰 増田
 
Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpYoshifumi Yamaguchi
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールAtsuo Ishimoto
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12Takanori Suzuki
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはkenhys
 
pythonでオフィス快適化計画
pythonでオフィス快適化計画pythonでオフィス快適化計画
pythonでオフィス快適化計画Kazufumi Ohkawa
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another ApproachDaisuke Miyakawa
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成Fuminobu TAKEYAMA
 

La actualidad más candente (20)

Easy caching and logging package using annotation in Python
Easy caching and logging package using annotation in PythonEasy caching and logging package using annotation in Python
Easy caching and logging package using annotation in Python
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
Pythonでゲーム作る
Pythonでゲーム作るPythonでゲーム作る
Pythonでゲーム作る
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト
 
Distutil setuptools distribute
Distutil setuptools distributeDistutil setuptools distribute
Distutil setuptools distribute
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)wxPython入門(大阪Pythonユーザの集まり2014/03)
wxPython入門(大阪Pythonユーザの集まり2014/03)
 
Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjp
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
 
Puppet入門
Puppet入門Puppet入門
Puppet入門
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするには
 
pythonでオフィス快適化計画
pythonでオフィス快適化計画pythonでオフィス快適化計画
pythonでオフィス快適化計画
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
 

Similar a パッケージングの今

Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstartHideki Saito
 
とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。Kouhei Maeda
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
 
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみたWebサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみたdo_aki
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Kimiyuki Yamauchi
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介Etsuji Nakai
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud AutomationEtsuji Nakai
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
Offline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすOffline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすKiwamu Okabe
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
シンプルなシステム構成フレームワークalnair
シンプルなシステム構成フレームワークalnairシンプルなシステム構成フレームワークalnair
シンプルなシステム構成フレームワークalnairNaoya Inada
 
20121119.dodai projectの紹介
20121119.dodai projectの紹介20121119.dodai projectの紹介
20121119.dodai projectの紹介Osamu Habuka
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2Etsuji Nakai
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいKazuhiro Oinuma
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 

Similar a パッケージングの今 (20)

Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstart
 
とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
Osc2013 tokyospring
Osc2013 tokyospringOsc2013 tokyospring
Osc2013 tokyospring
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみたWebサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
 
Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)Lapp環境をソースからインストールする(centos)
Lapp環境をソースからインストールする(centos)
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
Offline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすOffline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはす
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
シンプルなシステム構成フレームワークalnair
シンプルなシステム構成フレームワークalnairシンプルなシステム構成フレームワークalnair
シンプルなシステム構成フレームワークalnair
 
20121119.dodai projectの紹介
20121119.dodai projectの紹介20121119.dodai projectの紹介
20121119.dodai projectの紹介
 
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第1日:講義No2
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 

Más de Atsushi Odagiri

async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022Atsushi Odagiri
 
pyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptoolspyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptoolsAtsushi Odagiri
 
Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Atsushi Odagiri
 
Python3 移行への軌跡
Python3 移行への軌跡Python3 移行への軌跡
Python3 移行への軌跡Atsushi Odagiri
 
Sqlalchemy sqlの錬金術
Sqlalchemy  sqlの錬金術Sqlalchemy  sqlの錬金術
Sqlalchemy sqlの錬金術Atsushi Odagiri
 
Pyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europythonPyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europythonAtsushi Odagiri
 
What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid uniqueAtsushi Odagiri
 
エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介Atsushi Odagiri
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3Atsushi Odagiri
 
フレームワークなしでWSGIプログラミング
フレームワークなしでWSGIプログラミングフレームワークなしでWSGIプログラミング
フレームワークなしでWSGIプログラミングAtsushi Odagiri
 
Nose 鼻をきかせてテストせよ
Nose  鼻をきかせてテストせよNose  鼻をきかせてテストせよ
Nose 鼻をきかせてテストせよAtsushi Odagiri
 

Más de Atsushi Odagiri (20)

async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022async/await の向こう側 PyCon Kyushu 2022
async/await の向こう側 PyCon Kyushu 2022
 
pyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptoolspyconjp 2019 LT 今日のsetuptools
pyconjp 2019 LT 今日のsetuptools
 
Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定
 
Python3 移行への軌跡
Python3 移行への軌跡Python3 移行への軌跡
Python3 移行への軌跡
 
Sqlalchemy sqlの錬金術
Sqlalchemy  sqlの錬金術Sqlalchemy  sqlの錬金術
Sqlalchemy sqlの錬金術
 
Clack meetup #1 lt
Clack meetup #1 ltClack meetup #1 lt
Clack meetup #1 lt
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
Bplt11 form alchemy
Bplt11 form alchemyBplt11 form alchemy
Bplt11 form alchemy
 
Python3でwebアプリ
Python3でwebアプリPython3でwebアプリ
Python3でwebアプリ
 
Pyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europythonPyconjp2012 memory-of-europython
Pyconjp2012 memory-of-europython
 
What makes pyramid unique
What makes pyramid uniqueWhat makes pyramid unique
What makes pyramid unique
 
エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介エキPy lt repoze.whoの紹介
エキPy lt repoze.whoの紹介
 
World plonedaylt
World plonedayltWorld plonedaylt
World plonedaylt
 
Setup.pysetup.cfg
Setup.pysetup.cfgSetup.pysetup.cfg
Setup.pysetup.cfg
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3
 
Form libraries
Form librariesForm libraries
Form libraries
 
フレームワークなしでWSGIプログラミング
フレームワークなしでWSGIプログラミングフレームワークなしでWSGIプログラミング
フレームワークなしでWSGIプログラミング
 
Form libraries
Form librariesForm libraries
Form libraries
 
Aodag scaffold
Aodag scaffoldAodag scaffold
Aodag scaffold
 
Nose 鼻をきかせてテストせよ
Nose  鼻をきかせてテストせよNose  鼻をきかせてテストせよ
Nose 鼻をきかせてテストせよ
 

パッケージングの今

  • 2. お前誰よ I aodag I Atsushi ODAGiri I 所属 I ビープラウド I Pylonsproject.jp
  • 3. 今日のsetuptools のバージョンいくつよ? I 1.1.5 2013-09-12 I 2.0 2013-12-08 I 5.7 2013-08-15
  • 4. アジェンダ I パッケージを使う I パッケージを作る I パッケージをもっと活用する
  • 5. パッケージを使う I pypi I pip I virtualenv
  • 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. 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. 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. 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. requirements.txt I 単純にパッケージを指定 pyramid==1.5.1 sqlalchemh==0.9.2 I リポジトリを指定 git+https://github.com/aodag/WebDispatch.git
  • 11. requirements.txt I オプションを追加 --no-index -f http://localhost:8080/dists I 他のrequirements.txt をインクルード -r requirements.txt
  • 12. wheel I wheel とは I パッケージの配布形式 I コンパイル済みのC 拡張などを含む I sdist と比べて容量が小さい I インストールが早い
  • 13. pip でwheel を作る I wheel パッケージが必要 pip install wheel I pip wheel コマンド pip wheel pyramid wheelhouse ディレクトリに依存ライブラリまで含めて、 wheel フォーマットで保存される
  • 14. pip でwheel をインストールする pip install -f wheelhouse pyramid-1.5.1-py2.py3-none-any.whl I “–find-links”(“-f”) オプションでwheelhouse ディレクトリを 指定するとそのディレクトリからインストールされる I “–no-index” オプションも併用するとローカルだけで依存ラ イブラリのインストールが完了する
  • 16. setup.py, setuptools I setuptools I 今のところパッケージングするための必須ツール I get-pip.py でpip のついでにインストールされる I setup.py I パッケージのメタデータなどを記述する I 内部ではsetuptools やdistutils などのsetup 関数を呼ぶだけ
  • 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. setup.py に書くべきこと long_description=""" aodag.hello ================== sample package """, install_requires=requires, url="http://example.com/aodag.hello" )
  • 19. パッケージをもっと活用する I パッケージを公開する I パッケージを限定的に公開する I CI やデプロイで活用する
  • 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. devpi I 機能 I ローカルに立てられるパッケージインデックスサーバー I PyPI へのプロキシとキャッシュ I devpi へのアップロード I プロジェクトごとの名前空間 I インストール pip install devpi
  • 22. devpi をプロキシとして使う I devpi-server devpi-server --start I index-server にdevpi を使う pip install -i http://localhost:3141/root/pypi/+simple/ WebDispatch
  • 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. devpi にアップロード devpi use aodag.hello devpi upload --formats "sdist,bdist_wheel" I devpi use でインデックスサーバーを指定 I devpi upload でアップロード I “–formats” オプションでアップロードするパッケージフォー マットを指定
  • 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. 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. CI やデプロイに活用する I CI のおともに I travis-ci などでテストするときに毎回依存ライブラリのダウ ンロードするのは効率が悪い I pip wheel しておいてwheelhouse まるごとVCS に入れてしま う(ベンダリング) I デプロイするときに I devpi サーバーなどをLAN にたてておけば不意のPyPI サー バーダウンでもなんとかなるかもしれない(キャッシュされ てないものは無理) I wheel をベンダリングして丸ごとデプロイしてしまうのが安 全だし早い
  • 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. devpi かwheel をベンダリングするか I ベンダリングすると依存ライブラリの取得にネットワークを 必要としない I テストで利用したのと同じライブラリであることが保証さ れる I wheel フォーマットでPyPI に登録されていないものでも、 pip wheel コマンドでwheel 化したものを使える I devpi でもwheel 化したものをプロジェクト用にアップロー ドしておけばよい I devpi では独自パッチをあてたサードパーティ製ライブラリ をindex-server で入れ替えておけるのでrequirements.txt で 個別のURL を指定しなくてもよい
  • 30. まとめ I パッケージを使う I pip が細かく進化している I パッケージを作る I まだまだsetuptools が現役 I パッケージを活用する I wheel をうまく利用すると、CI やデプロイを効率化できる かも
  • 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/