Dependency management

Lev Kovalenko

Почему это важно?

  • Repeatability
  • Replicability
  • Reusable

История развития

Pip - default package manager

Install packages

Установка пакетов.

pip install <package1> <package2>

Установка пакета определенной версии.

pip install <package1==version1> '<package2>=version2>'

Установка пакетов из requirements.txt.

pip install -r requirements.txt

Обновление уже установленного пакета.

pip install --upgrade <package>

Использование приватного индекса пакетов.

pip install --index-url <index-url> <package>

Установка пакетов из git.

pip install git+https://<git-package-url>@<version>

Установка пакетов с расширениями.

pip install <package>[<extras>]

Установка пререлизного пакета.

pip install --pre <package>

Установка своих пакетов в редактируемой режиме.

pip install --editable ./<package-path>

Установка своих пакетов из исходного кода.

pip install --no-binary <package>

Dependecy resolver

  • Появился backtracking dependencies
  • Увеличена строгость резолвера
  • Появился state managment
  • Улучшилась поддержка constraints

Requirement dependecies

Что бы зафиксировать требуемые зависимости можно:

pip freeze > requirements.txt


Строгая фиксация requirements.txt:

certifi==x.y.z
charset-normalizer==x.y.z
idna==x.y.z
requests==x.y.z
urllib3==x.y.z

Тонкая настройка requirements.txt:

certifi>=x.y.z
charset-normalizer>=x.y.z
idna>=x.y.z
requests>=x.y.z
urllib3>=x.y.z

Dev/Prod dependecies

Зависимости для развертывания

# requirements.txt
package==1.0
package==1.0
package==1.0

Зависитмости для разработки

# dev_requirements.txt
-r requirements.txt
dev_package==1.0
dev_package==1.0
dev_package==1.0

Pros&Cons

Pros

  • default tool
  • deterministic builds
  • dependecy resolver

Cons

  • no built-in isolation tool
  • problematical dev and prod dependency split
  • no tools for lib packaging and publishing
  • buildings from source

Conda - package, dependency and environment manager

Conda packages

Структура пакета

.
├── bin
│   └── pyflakes
├── info
│   ├── LICENSE.txt
│   ├── files
│   ├── index.json
│   ├── paths.json
│   └── recipe
└── lib
    └── python3.5

Поиск пакетов:

conda search <package>

Установка пакетов:

conda install <package>

Сборка пакетов с помощью conda-build:

conda build <my_package>

Conda channels

Установка из определенного channel

conda install scipy --channel conda-forge

Добавление channel по умолчанию

conda config --add channels new_channel

Список доступных channels:

anaconda
r
conda_forge
bioconda
astropy
metachannel
javascript
private

Conda environments

Создание пустого окружения

conda create --name <myenv>

Создание питоноского окружения

conda create -n <myenv> python=3.9

Установка пакета в определенное окружение

conda install -n <myenv> <package>

Создание файла зависимостей

# только те которые были устанволены в ручную
conda env export --from-history > environment.yml
# все зависимости и сабзависимости
conda env export > environment.yml

Создание окружения из файла зависимостей

conda env create -f environment.yml

Обновление окружения из файла зависимостей

conda env update -f environment.yml

Pros&Cons

Pros

  • deterministic builds
  • dependecy resolver
  • built-in isolation tool
  • tools for lib packaging and publishing
  • builded binary packages

Cons

  • very slow dependency resolver
  • a lot of steps for preparing package build
  • no dependencies split

Mamba

Poetry

Project structure

Структура проекта

poetry-demo
├── pyproject.toml
├── poetry.lock
├── README.md
├── poetry_demo
│   └── __init__.py
└── tests
    └── __init__.py

Инициализация проекта

poetry new <project-path>

Pyproject.toml

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Kovalenko Lev"]
readme = "README.md"
packages = [{include = "poetry_demo"}]
 
[tool.poetry.dependencies]
python = "^3.9"
 
 
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Dependency install

Установка пакета

poetry add <package>

Установка пакета определенной версии

# Allow >=2.0.5, <3.0.0 versions
poetry add package@^2.0.5
# Allow >=2.0.5, <2.1.0 versions
poetry add package@~2.0.5
# Allow >=2.0.5 versions, without upper bound
poetry add "package>=2.0.5"
# Allow only 2.0.5 version
poetry add package==2.0.5

Установка пакета из git

poetry add git+https://github.com/sdispater/package.git#version

Установка своих пакетов в редактируемой режиме

poetry add ---editable ./<package-path>

Добавление зависимости в определенную группу

poetry add <package> --group <group>
# для dev зависимостей
poetry add <package> --group dev
poetry add --dev <package>

Установка пререлизных зависимостей

poetry add --allow-prereleases <package>

Установка зависимостей из различных репозиториев

poetry source add <source> https://<source-link>
poetry add --source <source> <package>

Установка расширений зависимостей

poetry add "<package>[<extras>]"

Посмотреть наличие обновлений

poetry show --tree

Провести обновление зависимостей

# обновить конкретную зависимость
poetry add <package>@latest
poetry update <package>
# обновить под зависимости
poetry update

Package build and publish

Сборка пакетов локально

poetry build

Публикация собранного пакета

poetry publish

Публикация и сборка пакета

poetry publish --build

Публикация пакета в приватный репозиторий

poetry publish -r <repo>

Pros&Cons

Pros

  • deterministic builds
  • dependecy resolver
  • dependecies groups
  • built-in isolation tool
  • tools for lib packaging and publishing
  • dependencies update tracking

Cons

  • buildings from source
  • a very young tool

Выводы

  • pip - дефолтный менеджер пакетов, соответствует всем pep
  • conda - лидер по environments, позволяет работать только с бинарными пакетами
  • poetry - собрал в себя все лучшие практики, но очень молодая технология