Как избежать путаницы зависимостей в python

#python #pip #dependencies #gem-fury

#питон #пип #зависимости #драгоценный камень-ярость

Вопрос:

В проекте python, над которым я работаю на своем рабочем месте, мы устанавливаем некоторые пакеты из PyPI и некоторые пакеты частной компании из Gemfury, используя стандартный файл требований.

После прочтения этой статьи: https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610 .

Наш файл требований выглядит примерно так:

 --index-url <OUR_GEMFURY_URL>
--extra-index-url https://pypi.python.org/simple

aiohttp==3.7.1
simplejson==3.17.1

<our-package>==1.0.0
<our-other-package>==1.2.0
 

Я попытался прочитать некоторые документы pip, но я не смог полностью понять, как он выбирает, откуда загружать пакет.
Например, что произойдет, если кто-то загрузит вредоносную версию 1.0.0 в pypi-prod — как pip узнает, какой из пакетов использовать?
Может быть, есть способ указать pip для определенного пакета, чтобы искать его только в —index-url?

Как вы защищаете свой код от путаницы с зависимостями? Спасибо за помощь!

Ответ №1:

В статье упоминается алгоритм, используемый pip:

  • Проверяет, существует ли библиотека в указанном (внутреннем) индексе пакета
  • Проверяет, существует ли библиотека в индексе общедоступного пакета (PyPI)
  • Устанавливается в зависимости от найденной версии. Если пакет существует на обоих устройствах, по умолчанию он устанавливается из источника с более высоким номером версии.

Поэтому, если требуется ваш скрипт <our-other-package>>=1.2.0 , вы можете получить некоторый пакет mailicios с общедоступного сервера pypi, если он имеет более высокую версию, чем та, которую вы намеревались установить.

Простое решение, упомянутое в статье, заключается в удалении --extra-index-url

Если package 1.0 это внутренний или внешний пакет и он присутствует на частном сервере pypi, он будет загружен оттуда.

Внешние пакеты будут загружены с общедоступного сервера pypi через внутренний сервер pypi, который будет кэшировать их для дальнейшего использования.

Я бы также предложил иметь явные версии в requirements.txt , таким образом, вы знаете о версиях, которые получаете, и делаете сознательные обновления, увеличивая версии.

Подводя итог руководящим принципам (которые ни в коем случае не являются исчерпывающими и защищают от всех возможных дыр в безопасности)

  • удалить --extra-index-url https://pypi.python.org/simple из pip.conf , requirements.txt и сценарии автоматизации.
  • укажите явные версии внутренних и внешних пакетов в requirements.txt