Kir Chou @ PyCon JP 2020
1
Pythonパッケージの影響を
歴史から理解してみよう!
⾃⼰紹介
• Kir Chou
• PyConの発表経験
• PyCon JP 2019 発表
• PyCon TW 2017, 2018, 2019 発表
• その他
• ソフトウェアエンジニア @ アマゾンジャパン
2
@k1rch0u
kir.chou
note35
今⽇の献⽴
• 動機
• Python パッケージの歴史
• 歴史から学ぶこと
• コミュニティが Python パッケージを解決する前の挑戦
• コミュニティが Python パッケージを解決した後の挑戦
• まとめ
• Python パッケージの歴史に関する資料
3
動機
4
5
ある⽇、ビルダーツールチームが発表しました…
これから、オープンソース化されたツールに移⾏しましょう!
6
良いじゃないか?でも、なんで?
6
7
@di_codes
Python パッケージの歴史
パッケージとは software distribution
8
9
1991
Python 1.0
10
ソースコードを他の⼈
に(から)与える(取る)ことは?
ソースコードを他の⼈に与えることは?
11
与える 取る
ソースコードを他の⼈から取ることは?
12
与える 取る
13
RFC822
14
1991 20052003
Python 1.0 Python 2.0
2000
PEP241 PEP345
PEP314
disutils (egg)
setuptools
2006
easy_install
PEP405
tox
virtualenv
20072008 2011
PyPI
15
メタデータ: PEP241 (2001), PEP314 (2003), PEP345 (2005)
ビルドツール: distutils, setuptools
16
setuptools: setup.py
EGGのメタデータ
xxx.egg-info/PKG-INFO
17
PyPI (Cheese Shop): PEP301 (2002/Nov)
Package インストーラ: easy_install
18
仮想環境(ビルド / テスト / リリース):
tox, virtualenv (2007), venv@PEP405 (2011)
19
20
1991 2011
Python 1.0
2008
Python 3.0
RFC822 PEP566
PEP459
PEP426
PEP427,440PEP376
20052003
Python 2.0
2000
PEP241 PEP345
PEP314
disutils (egg)
setuptools
2006
wheel
easy_install
bento/twine
PyPI
pip
PEP405
tox
virtualenv
2007
PEP394 PEP582
poetry
pipenv
2012 2017
PyPI
warehouse
PEP262
21
(延期)メタデータ2.0: PEP426 (2012), PEP459 (2013)
メタデータ 2.1: PEP566 (2017/Dec)
22
PEP566: pyproject.toml
23
バージョン識別と依存関係
PEP386 (2009/Superseded), pip-tools/pip-sync (2012)
PEP440 (2013), PEP508 (2015)
24
パッケージインストーラー (2008): pip
公開ツール(2013): bento / twine / flit
PyPI (2018): PyPI warehouse
25
データベース : PEP262 (2001/Deferred), PEP376 (2009)
Wheel: PEP425 (2012) / PEP427 (2012)
26
PEP376
データベースインターフェース
xxx.dist-info/WHEEL
27
28
ワン・フォー・オール: Conda / Pipenv / Poetry
PEP517 (2015), PEP518 (2016)
29
歴史から学ぶこと
Python パッケージの進化
30
1. メタデータスキーマの定義
31
2. ビルドツール
1. メタデータスキーマの定義 Python パッケージの進化
32
2. ビルドツール
1. メタデータスキーマの定義
3.公開ツール・PyPI
Python パッケージの進化
33
2. ビルドツール
1. メタデータスキーマの定義
4. インストーラ
デプロイツール
Python パッケージの進化
3. 公開ツール・PyPI
34
2. ビルドツール
1. メタデータスキーマの定義
4. インストーラ
デプロイツール
5. 複数 OS の問題
Python パッケージの進化
3. 公開ツール・PyPI
35
2. ビルドツール
1. メタデータスキーマの定義
3. 公開ツール・PyPI
4. インストーラ
デプロイツール
5. 複数 OS とバージョンの問題
Python パッケージの進化
36
1991
Python 1.0
wheel
PyPI Hosting
pipenv
poetry
パターンは世代ごとに繰り返されます
2008
Python 3.0
tox
Python 2.0
2000
disutils (egg)
setuptools
PyPI
virtualenv
bento/twine
easy_install
(egg)
pip
1994 アマゾン
1998 グーグル
37
コミュニティが解決する前の挑戦
38
1991 1998
Python 1.0
グーグル
1994
アマゾン
Python パッケージに標準はない
39
ソースコードを他の⼈
に(から)与える(取る)ことは?
歴史の中で同じ問題を解決する
• ビルドツール
• 依存関係リゾルバー
• 複数Pythonバージョンのサポート
• 公開ツール / パッケージレジストリ
• インストーラー / デプロイツール
• 仮想環境のサポート
• 複数OSのサポート
40
41
2. 内部構築ツール
1. 内部パッケージメタデータ
3.内部パッケージレジストリ
4. 内部デプロイツール
42
3pパッケージは
すべて内部ツールによって管理されます!
43
44
会社
コミュニティ
X 機能拡張率
X
コミュニティソリューションは
より速く確実に拡張されます
~2012
パッケージングの問題は
ほとんどが⼀般的です
• ビルドツール
• Python パケージングは?
• Python パケージング依存関係はどでしょうか?
• Python パッケージをビルドする⽅法は?
• 公開ツール / パッケージレジストリ
• Python パッケージを公開する⽅法は?
• 他のPythonの依存関係をダウンロードする⽅法は?
• インストーラー / デプロイツール
• Python 環境を分離する⽅法は?(仮想環境)
• Python パッケージはどのプOSをサポートしていますか?
45
これがコミュニティソリューションに
移⾏する理由です
47
コミュニティが解決した後の挑戦
1. 企業とコミュニティの理想的な関係
48
コミュニティの
ソリューション
会社のソリューション
コミュニティの
ソリューション
会社のソリューション
49
50
クラウドサービス
のビジネス
クラウドサービス
のプロバイダー
開発者
コミュニティ
協賛
お⾦を払う
新しいソリューション
を提供する
新しいソリューションを採⽤する
ワン・フォー・オール
オール・フォー・ワン
51
2. メタデータ標準の数 ∝ ツールの数
52
53
54
PyConに参加しましょう!
コミュニティに参加しましょう!
55
古きをたずねて新しきを知る
まとめ
歴史と前の挑戦 今の挑戦
コミュニティ
背景資料
56
歴史
• Dustin Ingram @ SciPy 2018
Inside the Cheeseshop: How Python Packaging Works
• History of packaging written by Martijn Faassen
• Kenneth Reitz @ PyCon 2018
Pipenv: The Future of Python Dependency Management
• Clinton Roy @ Kiwi PyCon X (2019)
The Packaging Lifecycle with Poetry
• History of wheel written by Daniel Holth
57
パッケージ
• Dave Forgac @ PyOhio 2015
Python Packaging from Init to Deploy
• Elana Hashman @ PyCon 2019
The Black Magic of Python Wheel
• Official Document: Packaging binary extensions (2013)
58
デプロイ(仮想環境)
• Carl Meyer @ PyCon 2011
Reverse-engineering Ian Bicking's brain: inside pip and
virtualenv
• Bernat Gabor @ EuroPython 2019
Status quo of virtual environments
59
ご静聴ありがとうございました!
60

Python パッケージの影響を歴史から理解してみよう!