Набор инструментов командной строки, которые помогут вам поддерживать актуальность пакетов на основе pip
, даже если вы их закрепили. Ты их прикрепляешь, да? (При создании вашего приложения Python и его зависимостей для рабочей среды вы должны быть уверены, что ваши сборки предсказуемы и детерминированы.)
Подобно pip
, pip-tools
необходимо установить в каждой виртуальной среде вашего проекта:
$ source /path/to/venv/bin/activate
(venv) $ python -m pip install pip-tools
Примечание . Все остальные примеры команд предполагают, что вы активировали виртуальную среду вашего проекта.
pip-compile
Команда pip-compile
позволяет скомпилировать файл requirements.txt
из ваших зависимостей, указанных в pyproject.toml
, setup.cfg
, setup.py
или requirements.in
.
Запустите его с помощью pip-compile
или python -m piptools compile
(или pipx run --spec pip-tools pip-compile
если pipx
был установлен с соответствующей версией Python). Если вы используете несколько версий Python, вы также можете запустить py -XY -m piptools compile
в Windows и pythonX.Y -m piptools compile
в других системах.
pip-compile
следует запускать из той же виртуальной среды, что и ваш проект, поэтому условные зависимости, требующие определенной версии Python или других маркеров среды, разрешаются относительно среды вашего проекта.
Примечание . Если pip-compile
обнаружит существующий файл requirements.txt
, который соответствует зависимостям, никакие изменения не будут внесены, даже если доступны обновления. Чтобы скомпилировать с нуля, сначала удалите существующий файл requirements.txt
или ознакомьтесь с разделом Обновление требований для альтернативных подходов.
pyproject.toml
Файл pyproject.toml
является новейшим стандартом настройки пакетов и приложений и рекомендуется для новых проектов. pip-compile
поддерживает установку как вашего project.dependencies
, так и вашего project.optional-dependencies
. Благодаря тому, что это официальный стандарт, вы можете использовать pip-compile
для закрепления зависимостей в проектах, в которых используются современные инструменты упаковки, соответствующие стандартам, такие как Setuptools, Hatch или flit.
Предположим, у вас есть приложение Python «foobar», упакованное с помощью Setuptools
, и вы хотите закрепить его для производства. Вы можете объявить метаданные проекта как:
[ build-system ]
requires = [ " setuptools " , " setuptools-scm " ]
build-backend = " setuptools.build_meta "
[ project ]
requires-python = " >=3.9 "
name = " foobar "
dynamic = [ " dependencies " , " optional-dependencies " ]
[ tool . setuptools . dynamic ]
dependencies = { file = [ " requirements.in " ] }
optional-dependencies.test = { file = [ " requirements-test.txt " ] }
Если у вас есть приложение Django, упакованное с помощью Hatch
, и вы хотите закрепить его для производства. Вы также можете закрепить свои инструменты разработки в отдельном файле закрепления. Вы объявляете django
как зависимость и создаете дополнительную dev
зависимостей, включающую pytest
:
[ build-system ]
requires = [ " hatchling " ]
build-backend = " hatchling.build "
[ project ]
name = " my-cool-django-app "
version = " 42 "
dependencies = [ " django " ]
[ project . optional-dependencies ]
dev = [ " pytest " ]
Вы можете создавать свои пин-файлы так же легко, как:
$ pip-compile -o requirements.txt pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --output-file=requirements.txt pyproject.toml
#
asgiref==3.6.0
# via django
django==4.1.7
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.3
# via django
$ pip-compile --extra dev -o dev-requirements.txt pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --extra=dev --output-file=dev-requirements.txt pyproject.toml
#
asgiref==3.6.0
# via django
attrs==22.2.0
# via pytest
django==4.1.7
# via my-cool-django-app (pyproject.toml)
exceptiongroup==1.1.1
# via pytest
iniconfig==2.0.0
# via pytest
packaging==23.0
# via pytest
pluggy==1.0.0
# via pytest
pytest==7.2.2
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.3
# via django
tomli==2.0.1
# via pytest
Это отлично подходит как для закрепления ваших приложений, так и для поддержания стабильности CI вашего пакета Python с открытым исходным кодом.
setup.py
и setup.cfg
pip-compile
также имеет полную поддержку проектов на основе setup.py
и setup.cfg
, которые используют setuptools
.
Просто определите свои зависимости и дополнительные возможности, как обычно, и запустите pip-compile
как указано выше.
requirements.in
Вы также можете использовать обычные текстовые файлы для своих нужд (например, если вы не хотите, чтобы ваше приложение было пакетом). Чтобы использовать файл requirements.in
для объявления зависимости Django:
# requirements.in
django
Теперь запустите pip-compile requirements.in
:
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile requirements.in
#
asgiref==3.6.0
# via django
django==4.1.7
# via -r requirements.in
sqlparse==0.4.3
# via django
И он создаст ваш requirements.txt
со всеми закрепленными зависимостями Django (и всеми базовыми зависимостями).
(требования к обновлению)=
pip-compile
создает файл requirements.txt
, используя последние версии, соответствующие зависимостям, указанным вами в поддерживаемых файлах.
Если pip-compile
обнаружит существующий файл requirements.txt
, который соответствует зависимостям, никакие изменения не будут внесены, даже если обновления доступны.
Чтобы заставить pip-compile
обновить все пакеты в существующем файле requirements.txt
, запустите pip-compile --upgrade
.
Чтобы обновить конкретный пакет до последней или определенной версии, используйте флаг --upgrade-package
или -P
:
# only update the django package
$ pip-compile --upgrade-package django
# update both the django and requests packages
$ pip-compile --upgrade-package django --upgrade-package requests
# update the django package to the latest, and requests to v2.0.0
$ pip-compile --upgrade-package django --upgrade-package requests==2.0.0
Вы можете объединить --upgrade
и --upgrade-package
в одной команде, чтобы задать ограничения на разрешенные обновления. Например, чтобы обновить все пакеты, ограничивая запросы последней версией ниже 3.0:
$ pip-compile --upgrade --upgrade-package ' requests<3.0 '
Если вы хотите использовать режим проверки хэшей, доступный в pip
начиная с версии 8.0, pip-compile
предлагает флаг --generate-hashes
:
$ pip-compile --generate-hashes requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile --generate-hashes requirements.in
#
asgiref==3.6.0
--hash=sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac
--hash=sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506
# via django
django==4.1.7
--hash=sha256:44f714b81c5f190d9d2ddad01a532fe502fa01c4cb8faf1d081f4264ed15dcd8
--hash=sha256:f2f431e75adc40039ace496ad3b9f17227022e8b11566f4b363da44c7e44761e
# via -r requirements.in
sqlparse==0.4.3
--hash=sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34
--hash=sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268
# via django
Чтобы вывести закрепленные требования в файле с именем, отличным от requirements.txt
, используйте --output-file
. Это может быть полезно для компиляции нескольких файлов, например, с различными ограничениями на django, чтобы протестировать библиотеку с обеими версиями с помощью tox:
$ pip-compile --upgrade-package ' django<1.0 ' --output-file requirements-django0x.txt
$ pip-compile --upgrade-package ' django<2.0 ' --output-file requirements-django1x.txt
Или для вывода на стандартный вывод используйте --output-file=-
:
$ pip-compile --output-file=- > requirements.txt
$ pip-compile - --output-file=- < requirements.in > requirements.txt
pip
Любые допустимые флаги или аргументы pip
могут быть переданы с помощью опции --pip-args
команды pip-compile
, например
$ pip-compile requirements.in --pip-args " --retries 10 --timeout 30 "
Вы можете определить значения по умолчанию для pip-compile
и pip-sync
на уровне проекта, записав их в файл конфигурации в том же каталоге, что и входные файлы ваших требований (или текущий рабочий каталог, если входные данные передаются из стандартного ввода). По умолчанию и pip-compile
, и pip-sync
сначала будут искать файл .pip-tools.toml
, а затем в вашем pyproject.toml
. Вы также можете указать альтернативный файл конфигурации TOML с помощью опции --config
.
Можно указать значения конфигурации как глобально, так и для конкретной команды. Например, чтобы по умолчанию генерировать хэши pip
в результирующем файле требований, вы можете указать в файле конфигурации:
[ tool . pip-tools ]
generate-hashes = true
Параметры pip-compile
и pip-sync
, которые могут использоваться более одного раза, должны быть определены в виде списков в файле конфигурации, даже если они имеют только одно значение.
pip-tools
поддерживает значения по умолчанию для всех допустимых флагов командной строки своих подкоманд. Ключи конфигурации могут содержать символы подчеркивания вместо тире, поэтому приведенное выше значение также можно указать в следующем формате:
[ tool . pip-tools ]
generate_hashes = true
Параметры конфигурации по умолчанию, специфичные для pip-compile
и pip-sync
можно поместить в отдельные разделы. Например, чтобы по умолчанию выполнить пробный прогон с помощью pip-compile
:
[ tool . pip-tools . compile ] # "sync" for pip-sync
dry-run = true
Это не влияет на команду pip-sync
, которая также имеет опцию --dry-run
. Обратите внимание, что локальные настройки имеют преимущество над глобальными настройками с тем же именем, когда оба они объявлены, поэтому это также приведет к тому, что pip-compile
будет генерировать хэши, но отбросит глобальную настройку пробного прогона:
[ tool . pip-tools ]
generate-hashes = true
dry-run = true
[ tool . pip-tools . compile ]
dry-run = false
Возможно, вы помещаете команду pip-compile
в другой скрипт. Чтобы не вводить в заблуждение потребителей вашего пользовательского сценария, вы можете переопределить команду обновления, созданную в верхней части файлов требований, установив переменную среды CUSTOM_COMPILE_COMMAND
.
$ CUSTOM_COMPILE_COMMAND= " ./pipcompilewrapper " pip-compile requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# ./pipcompilewrapper
#
asgiref==3.6.0
# via django
django==4.1.7
# via -r requirements.in
sqlparse==0.4.3
# via django
Если у вас разные среды, для которых вам нужно установить разные, но совместимые пакеты, вы можете создать многоуровневые файлы требований и использовать один уровень для ограничения другого.
Например, если у вас есть проект Django, в котором вы хотите использовать новейшую версию 2.1
и при разработке вы хотите использовать панель инструментов отладки Django, вы можете создать два файла *.in
, по одному для каждого слоя:
# requirements.in
django<2.2
В верхней части требований к разработке dev-requirements.in
вы используете -c requirements.txt
, чтобы ограничить требования разработки пакетами, уже выбранными для производства в requirements.txt
.
# dev-requirements.in
-c requirements.txt
django-debug-toolbar<2.2
Сначала скомпилируйте requirements.txt
как обычно:
$ pip-compile
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile
#
django==2.1.15
# via -r requirements.in
pytz==2023.3
# via django
Теперь скомпилируйте требования разработчика, и файл requirements.txt
будет использоваться в качестве ограничения:
$ pip-compile dev-requirements.in
#
# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
# pip-compile dev-requirements.in
#
django==2.1.15
# via
# -c requirements.txt
# django-debug-toolbar
django-debug-toolbar==2.1
# via -r dev-requirements.in
pytz==2023.3
# via
# -c requirements.txt
# django
sqlparse==0.4.3
# via django-debug-toolbar
Как вы можете видеть выше, несмотря на то, что доступна версия Django 2.2
, требования разработчиков включают только версию Django 2.1
, поскольку они были ограничены. Теперь оба скомпилированных файла требований можно безопасно установить в среде разработки.
Для установки требований на этапе производства используйте:
$ pip-sync
Вы можете установить требования на стадии разработки:
$ pip-sync requirements.txt dev-requirements.txt
Вы можете использовать pip-compile
как привязку для предварительной фиксации. Инструкции см. в документации по предварительной фиксации. Пример .pre-commit-config.yaml
:
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
Возможно, вы захотите настроить аргументы pip-compile
настроив args
и/или files
, например:
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
files : ^requirements/production.(in|txt)$
args : [--index-url=https://example.com, requirements/production.in]
Если у вас несколько файлов требований, обязательно создайте привязку для каждого файла.
repos :
- repo : https://github.com/jazzband/pip-tools
rev : 7.4.1
hooks :
- id : pip-compile
name : pip-compile setup.py
files : ^(setup.py|requirements.txt)$
- id : pip-compile
name : pip-compile requirements-dev.in
args : [requirements-dev.in]
files : ^requirements-dev.(in|txt)$
- id : pip-compile
name : pip-compile requirements-lint.in
args : [requirements-lint.in]
files : ^requirements-lint.(in|txt)$
- id : pip-compile
name : pip-compile requirements.in
args : [requirements.in]
files : ^requirements.(in|txt)$
pip-sync
Теперь, когда у вас есть файл requirements.txt
, вы можете использовать pip-sync
для обновления вашей виртуальной среды, чтобы она точно отражала то, что там находится. Это позволит установить/обновить/удалить все необходимое в соответствии с содержимым файла requirements.txt
.
Запустите его с помощью pip-sync
или python -m piptools sync
. Если вы используете несколько версий Python, вы также можете запустить py -XY -m piptools sync
в Windows и pythonX.Y -m piptools sync
в других системах.
pip-sync
должен быть установлен и запущен в той же виртуальной среде, что и ваш проект, чтобы определить, какие пакеты следует установить или обновить.
Будьте осторожны : pip-sync
предназначен для использования только с файлом requirements.txt
, созданным pip-compile
.
$ pip-sync
Uninstalling flake8-2.4.1:
Successfully uninstalled flake8-2.4.1
Collecting click==4.1
Downloading click-4.1-py2.py3-none-any.whl (62kB)
100% |................................| 65kB 1.8MB/s
Found existing installation: click 4.0
Uninstalling click-4.0:
Successfully uninstalled click-4.0
Successfully installed click-4.1
Чтобы синхронизировать несколько списков зависимостей *.txt
, просто передайте их с помощью аргументов командной строки, например
$ pip-sync dev-requirements.txt requirements.txt
Передача пустых аргументов приведет к тому, что по умолчанию будет использован файл requirements.txt
.
Любые действительные флаги или аргументы pip install
могут быть переданы с помощью опции --pip-args
pip-sync
, например
$ pip-sync requirements.txt --pip-args " --no-cache-dir --no-deps "
Примечание . pip-sync
не будет обновлять или удалять инструменты упаковки, такие как setuptools
, pip
или сами pip-tools
. Используйте python -m pip install --upgrade
для обновления этих пакетов.
requirements.in
и requirements.txt
в систему контроля версий? В целом да. Если вы хотите, чтобы воспроизводимая установка среды была доступна из вашей системы управления версиями, тогда да, вам следует зафиксировать как requirements.in
, так и requirements.txt
в системе управления версиями.
Обратите внимание: если вы выполняете развертывание в нескольких средах Python (читайте раздел ниже), вам необходимо зафиксировать отдельный выходной файл для каждой среды Python. Мы предлагаем использовать формат {env}-requirements.txt
(например: win32-py3.7-requirements.txt
, macos-py3.10-requirements.txt
и т. д.).
requirements.in
/ requirements.txt
и pip-compile
Зависимости пакета могут меняться в зависимости от среды Python, в которой он установлен. Здесь мы определяем среду Python как комбинацию операционной системы, версии Python (3.7, 3.8 и т. д.) и реализации Python (CPython, PyPy и т. д.). Для точного определения обратитесь к возможным комбинациям маркеров окружающей среды PEP 508.
Поскольку результирующий requirements.txt
может отличаться для каждой среды, пользователи должны выполнить pip-compile
в каждой среде Python отдельно , чтобы сгенерировать файл requirements.txt
действительный для каждой указанной среды. Один и тот же requirements.in
можно использовать в качестве исходного файла для всех сред, используя при необходимости маркеры среды PEP 508, так же, как это было бы сделано для обычного использования pip
в разных средах.
Если сгенерированный requirements.txt
остается одинаковым для всех сред Python, его можно безопасно использовать в разных средах Python. Но пользователям следует быть осторожными, поскольку любое обновление пакета может привести к появлению зависимостей, зависящих от среды, в результате чего любой вновь созданный requirements.txt
также будет зависеть от среды. Как правило, пользователям рекомендуется всегда выполнять pip-compile
в каждой целевой среде Python, чтобы избежать проблем.
pip-tools
— отличный инструмент для улучшения воспроизводимости сборок. Но есть несколько вещей, которые следует иметь в виду.
pip-compile
будет давать разные результаты в разных средах, как описано в предыдущем разделе.pip
необходимо использовать с переменной среды PIP_CONSTRAINT
для блокировки зависимостей в средах сборки, как описано в #8439. Продолжая приведенный ранее пример pyproject.toml
, создание одного файла блокировки можно выполнить следующим образом:
$ pip-compile --all-build-deps --all-extras --output-file=constraints.txt --strip-extras pyproject.toml
#
# This file is autogenerated by pip-compile with Python 3.9
# by the following command:
#
# pip-compile --all-build-deps --all-extras --output-file=constraints.txt --strip-extras pyproject.toml
#
asgiref==3.5.2
# via django
attrs==22.1.0
# via pytest
backports-zoneinfo==0.2.1
# via django
django==4.1
# via my-cool-django-app (pyproject.toml)
editables==0.3
# via hatchling
hatchling==1.11.1
# via my-cool-django-app (pyproject.toml::build-system.requires)
iniconfig==1.1.1
# via pytest
packaging==21.3
# via
# hatchling
# pytest
pathspec==0.10.2
# via hatchling
pluggy==1.0.0
# via
# hatchling
# pytest
py==1.11.0
# via pytest
pyparsing==3.0.9
# via packaging
pytest==7.1.2
# via my-cool-django-app (pyproject.toml)
sqlparse==0.4.2
# via django
tomli==2.0.1
# via
# hatchling
# pytest
Некоторые серверные части сборки также могут динамически запрашивать зависимости сборки с помощью перехватчиков get_requires_for_build_
описанных в PEP 517 и PEP 660. Это будет указано в выходных данных с помощью одного из следующих суффиксов:
(pyproject.toml::build-system.backend::editable)
(pyproject.toml::build-system.backend::sdist)
(pyproject.toml::build-system.backend::wheel)
pip-compile-multi — оболочка команды pip-compile для нескольких файлов требований с перекрестными ссылками.
pipdeptree для печати дерева зависимостей установленных пакетов.
Подсветка requirements.txt
requirements.in
:
В этом разделе перечислены функции pip-tools
, которые в настоящее время устарели.
--allow-unsafe
будет включено по умолчанию (#989). Используйте --no-allow-unsafe
чтобы сохранить старое поведение. Рекомендуется передать --allow-unsafe
сейчас, чтобы адаптироваться к предстоящим изменениям.--resolver=backtracking
.--strip-extras
будет включено по умолчанию (#1613). Используйте --no-strip-extras
чтобы сохранить старое поведение.Вы можете выбрать либо преобразователь обратного отслеживания по умолчанию, либо устаревший преобразователь прежних версий.
Устаревший преобразователь иногда не может разрешить зависимости. Резолвер с обратным отслеживанием более надежен, но в целом его запуск может занять больше времени.
Вы можете продолжать использовать устаревший преобразователь с --resolver=legacy
хотя учтите, что он устарел и будет удален в будущем выпуске.