Рубрики
Без рубрики

Быстрый совет: Как я использую pip-инструменты для устранения зависимостей

pip-tools-это инструмент разработки на Python, который поможет вам обеспечить детерминированные и предсказуемые сборки. Лучший способ понять, что это значит, – это пример. Допустим, вы клонируете проект…

Автор оригинала: Adam Mertz.

pip-tools – это инструмент разработки на Python, который поможет вам обеспечить детерминированные и предсказуемые сборки. Лучший способ понять, что это значит, – это пример. Допустим, вы клонируете проект для работы над новой функцией. В первый день вы создаете свой virtualenv и устанавливаете все зависимости (через requirements.txt ). К 3-му дню вы закончили эту функцию и готовы к выпуску. Однако в то же время один из базовых пакетов изменился, и это вызывает перерыв во время сборки. Вы никогда не поймали это, потому что у вас были разные зависимости локально. pipe-tools решает эту проблему путем компиляции requirements.txt файл со всеми используемыми пакетами, включая базовые зависимости, закрепленные в файле.

Я не собираюсь слишком углубляться в различные функции pipe-tools , учитывая, что я не использую их все, и они довольно хорошо описаны в документации. Вы можете прочитать об этом подробнее на их GitHub Я хочу показать, как я обычно настраиваю свои проекты приложений Python, когда я использую pip-tools .

Приложения имеют зависимости для запуска, а также зависимости для разработки. Мне нравится иметь их отдельно requirements.in и requirements-dev.in . Это позволяет отделить скомпилированные зависимости друг от друга. Так, например, у меня было бы следующее requirements.in

django<3.1
djangorestframework

А затем следующее в requirements-dev.in .

pip-tools
pytest
pytest-django

Затем я хотел бы настроить Makefile просто для ускорения разработки.

# This is usually my first target so as soon as a developer clones
# a project and creates a virtualenv they can just run `make` to get things going.
install:
  @pip install \
  -r requirements.txt \
  -r requirements-dev.txt

compile:
  @rm -f requirements*.txt
  @pip-compile requirements.in
  @pip-compile requirements-dev.in
    
sync:
  @pip-sync requirements*.txt

В основном я просто запускаю make compile && make sync , чтобы получить самые новые пакеты. Затем у меня обычно будет сделать тест цель, чтобы убедиться, что все по-прежнему работает.

Я хочу выделить одну из моих любимых функций pipe-tools , а именно то, что он печатает, откуда появились зависимости в requirements.txt файлы.

django==2.1.15
    # via
    #   -c requirements.txt
    #   django-debug-toolbar

Я нашел это очень полезным для отслеживания ненужных зависимостей в приложениях. Однажды мы обнаружили, что устанавливаем pandas в приложениях, которые никогда его не использовали. Это огромный пакет, поэтому мы смогли отследить, откуда он пришел, и исправить его. В другой раз это пригодилось, когда мы использовали то, что фактически стало пакетом catch all. Этот пакет использовался непосредственно в приложениях, а также в тонне различных базовых пакетов. Она охватила всю нашу организацию. Этот пакет вызвал установку зависимостей, таких как Django, в приложениях, которые даже не были веб-приложениями. Большинство приложений почти не использовали пакет. В какой-то момент из-за ошибки разработчика в пакете он отключил 3 API. Список зависимостей позволил нам определить его использование и удалить его.

Надеюсь, вы нашли это полезным. Дай мне знать, что ты думаешь. Кроме того, я подумываю о том, чтобы сделать короткую запись о полезных функциях Makefiles , которые мне нравятся. Дайте мне знать, если это вас тоже заинтересует.