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
, которые мне нравятся. Дайте мне знать, если это вас тоже заинтересует.