Цель этой презентации пролить свет на ситуацию с управлением пакетами и выделить важные этапы в эволюции инструментов, поскольку на исходной странице “History of Packaging” представлены только датированные вехи без контекста.
site
modulePATH
.site
.
distutils
distutils
. <root>/
├── src/
│ ├── __init__.py
│ ├── foo.py
│ └── bar.py
└── setup.py
setup.py
с следующим содержанием:
distutils
, так что пример приведен только в образовательных целях.import hooks
__builtin__.__import__
(PEP 302).import hooks
.
importlib
.PyPI
setuptools
distutils
- setuptools
.
install_requires
.easy_install
.egg
.setuptools
решила большинство проблем с пакетами в момент появления и, вероятно, стала самой популярной библиотекой для упаковки, она до сих пор не является частью стандарта.virtualenv
и venv
virtualenv
, позволяющая создавать изолированные среды для установки и использования пакетов, а также ссылаться на разные версии Python в этих окружения.
virtualenv
.
user@unix:/usr/home/test# virtualenv ENV
user@unix:/usr/home/test/ENV# tree -L 3
.
├── bin
│ ├── activate
│ ├── easy_install
│ ├── python
│ ├── python3 -> python
│ └── python3.10 -> python
├── include
│ └── python3.10m -> /usr/include/python3.10m
└──lib
├──python3.10
├── abc.py -> /usr/lib/python3.7/abc.py
├── . . .
├── weakref.py -> /usr/lib/python3.7/weakref.py
├── distutils
├── site-packages
└── site.py
venv
venv
, использующий новый стандарт PEP 405, который вводит механизм для легковесных окружений.
venv
:
venv
и посмотрим содержимое полученной папки:
user@unix:/usr/home/test2# python3 -m venv ENV
user@unix:/usr/home/test2# tree -L 3
.
└── ENV
├── bin
│ ├── activate
│ ├── easy_install
│ ├── easy_install-3.10
│ ├── python -> python3
│ └── python3 -> /usr/bin/python3
├── include
├── lib
│ └── python3.10
├── lib64 -> lib
├── pyvenv.cfg
└── share
pyenv.cfg
:
user@unix:/usr/home/test2# cat ENV/pyvenv.cfg
home = /usr/bin
include-system-site-packages = false
version = 3.10.0
virtualenv
продолжает независимо развиваться, не смотря на то, что часть его функций была перенесена в стандартную библиотеку Python в виде модуля venv
.pip
pip
, как замена easy_install
из setuptools.
distutils
и setuptools
решали задачи не только установки, но и сборки пакетов, pip
изначально концентрировался на вопросе установки пакетов.pip
представил сообществу формат файла requirements.txt
, в котором можно указать требуемые библиотеки и их версии.pip
объединил под собой существующие форматы и решения и стал стандартом установки пакетов на языке Python.setuptools
для сборки пакетов из зависимостей, однако с появлением новых стандартов, описывающих build backend
, pip
перестал зависеть от setuptools
и стал выполнять роль build frontend
.pip
позиционирует себя как инструмент установки пакетов на Python. Он не выполняет роль менеджера проекта.PyPA
Anaconda
conda packages
.conda packages
для них в этом же году разработали первую версию пакетного менеджера, который назвали conda
.conda packages
– repo.anaconda.com, и для сообщества открыли возможность создавать свои “каналы” для пакетного менеджера conda
.Mamba.org
conda-forge
– Quansight, QuantStack и несколько крупных контрибьютеров conda-forge
.Quetz
Mamba
Boa
libmamba
от “Mamba Org” в пакетный менеджер conda
.wheels
wheels
, описанный в PEP 427.wheels
становится приоритетный форматом поставки пакетов.wheels
достаточно похож на формат conda package
, однако у них есть расхождения на уровне наименований, а также работы с shared libs.pyproject.toml
Достаточно важный сдвиг в парадигме управления пакетами Python.
pyproject.toml
.manylinux
. А в 2019 появится последняя версия стандарта уже для формата пакетов wheels
.build backend
.pyproject.toml
. В этом же году принимается стандарт PEP 621, в котором фиксируется, что теперь в файле pyproject.toml
указываются и все метаданные пакета. Таким образом, вместе с PEP 518, PEP 517 и PEP 631 унифицируя конфигурацию Python пакета, приводя наконец всё к одному файлу.pyproject.toml
.pipenv
pip
взял на себя роль установщика пакетов, но не полноценного менеджера проекта.pipenv
, который сейчас находится под управлением PyPA
. pipenv
обладает следующей функциональностью:
Pipfile.lock
из Pipfile
, при этом оставляя возможность указывать только то, что вы хотите.pyenv
.Pipfile
, который выполняет рольrequerements.txt
, позволяя при этом задавать не только зависимости проекта, но зависимости необходимые на этапе разработки.Pipfile
при их установке или удалении.