2026, Jan 08 06:02

Установка Black, сохранив packaging==21.3: рабочие способы

Как поставить Black без обновления packaging==21.3: используйте файл ограничений (-c), пин в команде или requirements.txt. Pip подберет совместимую версию.

Поддерживать стабильность Python‑окружения и одновременно добавлять новые инструменты — непросто. Типичная ситуация: в проекте зафиксирован packaging==21.3, но установка актуальной версии Black требует packaging>=22.0 и незаметно обновляет зависимость. Если вы не готовы менять предпосылки рантайма, нужен способ поставить совместимый Black без ручного перебора версий.

Воспроизводим проблему

Установка Black напрямую из PyPI тянет самый свежий релиз и обновляет транзитивные зависимости. На системе, где уже стоит packaging==21.3, вывод будет примерно таким:

$ pip install black
Collecting packaging>=22.0 (from black)
Using cached packaging-25.0-py3-none-any.whl.metadata (3.3 kB)
Installing collected packages: packaging, black
Attempting uninstall: packaging
  Found existing installation: packaging 21.3
  Uninstalling packaging-21.3:
    Successfully uninstalled packaging-21.3
Successfully installed black-25.1.0 packaging-25.0

Именно такого обновления мы и хотим избежать на «чистой» системе, где поведение должно оставаться прежним.

Почему так происходит

Свежие версии Black зависят от packaging>=22.0. Когда вы просите pip поставить black без дополнительных ограничений, он выбирает самый новый Black и затем обновляет packaging, чтобы удовлетворить зависимость. Если в проекте необходимо сохранить packaging==21.3, нужно подсказать резолверу учитывать это ограничение при выборе совместимого релиза Black. Зависимость Black на packaging>=22.0 появилась в версии 23.1.0, поэтому более ранние релизы Black остаются совместимы с packaging==21.3.

Практические способы установить совместимый Black

Самое простое решение — использовать файл ограничений, который фиксирует packaging на 21.3, и позволить pip отступить к версии Black, совместимой с ним. Так вы избегаете подбора версий наугад.

echo "packaging==21.3" > constraints.txt
pip install black -c constraints.txt

Если удобнее обойтись одной командой без отдельного файла, зафиксируйте packaging прямо в установке. Pip подберёт подходящий релиз Black:

pip install black packaging==21.3

Если в проекте уже есть requirements.txt с packaging==21.3, используйте его как источник ограничений при установке:

pip install black -c requirements.txt

Зачем это нужно

Инструменты должны добавляться без риска расшатать рабочее окружение. Направляя pip с помощью ограничений, вы сохраняете закреплённые зависимости и позволяете резолверу автоматически найти подходящую версию инструмента. Это избавляет от ручного «ныряния» по версиям, снижает число сюрпризов в CI и делает развёртывание на новых машинах безопаснее.

Выводы

Добавляя инструменты разработки вроде Black в проект с жёсткими пинами, не ставьте их «вслепую». Зафиксируйте packaging==21.3 через файл ограничений или прямо в команде установки и позвольте pip выбрать совместимый релиз Black. Если в репозитории уже есть requirements.txt, подключите его через флаг -c, чтобы соблюсти существующие версии.