Будущий инструмент управления зависимостями Python pipenv на PyCon 2018

Node.js задняя часть Python PyCon NPM
Будущий инструмент управления зависимостями Python pipenv на PyCon 2018

0x00 Предисловие

На PyCon 2018 прозвучало много замечательных выступлений. В сегодняшней статье я представлю выступление K God «Будущий инструмент управления пакетами Python pipenv».

От Кеннета Рейца, это must-have.

0x01 История эволюции пакетов Python

Вот как Pythonist «древних времен» устанавливал зависимости.

curl http://pypi.python.org/packages/alsdasdl/requests.tar.gz | tar zxf
cd requests/
python setup.py install

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

  • Как вы решаете некоторые зависимые библиотеки, которые зависят от других библиотек? Например, pandas нужно установить numpy
  • Что делать, если некоторые зависимые библиотеки зависят от библиотеки c? например LXML
  • В python2.6.5, что, если мне нужно установить две разные версии Django для разработки разных программ? Можно ли динамически копировать файлы только в сайт-пакеты?

Позже мы установили такой пакет.

easy_install requests

Мы можем установить прямо из pypi. Но Нима, почему easy_install легко устанавливается, а easy_uninstall нет?

Ну а после 2010 года идем дальше:

  • Easy_install можно заменить на pip.
  • Теперь вы можете управлять зависимостями вашего проекта через virtualenv. Хотя по-прежнему невозможно установить несколько версий программного обеспечения в одной системе одновременно, как в случае с ruby ​​gem.
  • Зависимости могут быть заблокированы с помощью требований.

Однако в тот же период в сообществах других языков программирования появились следующие инструменты управления пакетами:

  • узел -> пряжа && npm с файлом блокировки
  • php -> composer с файлом блокировки
  • ржавчина -> груз, с файлом блокировки
  • ruby -> сборщик с файлом блокировки

И мой большой Python не поспевает за трендом

python -> pip && virtualenv/venv, без файла блокировки

PS: после Python 3.3 модуль venv можно использовать напрямую по умолчанию, и больше нет необходимости устанавливать virtualenv. Но это все еще должно быть ручным, и это нелогично использовать.

Некоторые люди говорят, что я могу получить версию 🔐 через требования

Тогда давайте поговорим о требованиях.txt

  • Если для формирования этого файла вы используете замораживание pip, это не интуитивно понятно, и совершенно невозможно увидеть, какая библиотека зависимостей зависит от какой зависимости.
  • Если вы вручную указываете нужную библиотеку, например flask, это кажется слишком интуитивным.
  • Было бы неплохо иметь вещь, которая могла бы представлять как результат заморозки (то, что вы хотите), так и нужную вам библиотеку (то, что вам нужно).

Конечно, это можно решить с помощью двух требований. Сначала установите то, что вам нужно для разработки, а затем заморозьте то, что вы хотите развернуть. То есть в конечном итоге генерируется requirements-dev.txt, а затем окончательно заморозка превращается в requirements-prod.txt.

На самом деле, есть еще некоторые области, которые можно оптимизировать.После стольких событий, K God, должно быть, пришел, чтобы представить свой pipenv.

Например, я хочу просмотреть зависимости этого проекта, непосредственно pipenv graph

coverage==4.5.1
fabric==2.0.1
  - cryptography [required: >=1.1, installed: 2.2.2]
    - asn1crypto [required: >=0.21.0, installed: 0.24.0]
    - cffi [required: >=1.7, installed: 1.11.5]
      - pycparser [required: Any, installed: 2.18]
    - idna [required: >=2.1, installed: 2.6]
    - six [required: >=1.4.1, installed: 1.11.0]
  - invoke [required: <2.0,>=1.0, installed: 1.0.0]
  - paramiko [required: >=2.4, installed: 2.4.1]
    - bcrypt [required: >=3.1.3, installed: 3.1.4]
      - cffi [required: >=1.1, installed: 1.11.5]
        - pycparser [required: Any, installed: 2.18]
      - six [required: >=1.4.1, installed: 1.11.0]
    - cryptography [required: >=1.5, installed: 2.2.2]
      - asn1crypto [required: >=0.21.0, installed: 0.24.0]
      - cffi [required: >=1.7, installed: 1.11.5]
        - pycparser [required: Any, installed: 2.18]
      - idna [required: >=2.1, installed: 2.6]
      - six [required: >=1.4.1, installed: 1.11.0]
    - pyasn1 [required: >=0.1.7, installed: 0.4.2]
    - pynacl [required: >=1.0.1, installed: 1.2.1]
      - cffi [required: >=1.4.1, installed: 1.11.5]
        - pycparser [required: Any, installed: 2.18]
      - six [required: Any, installed: 1.11.0]
flake8==3.5.0
  - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1]
  - pycodestyle [required: <2.4.0,>=2.0.0, installed: 2.3.1]
  - pyflakes [required: >=1.5.0,<1.7.0, installed: 1.6.0]
# 其他省略

Предположим, я хочу проверить, есть ли какие-то сбои в зависимостях моей текущей среды разработки. Выполнить проверку напрямую

$ pipenv check
Checking PEP 508 requirements…
Passed!
Checking installed package safety…

33075: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
Django before 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3, when settings.DEBUG is True, allow remote attackers to conduct DNS rebinding attacks by leveraging failure to validate the HTTP Host header against settings.ALLOWED_HOSTS.

33076: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
Django 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3 use a hardcoded password for a temporary database user created when running tests with an Oracle database, which makes it easier for remote attackers to obtain access to the database server by leveraging failure to manually specify a password in the database settings TEST dictionary.

33300: django >=1.10,<1.10.7 resolved (1.10.1 installed)!
CVE-2017-7233: Open redirect and possible XSS attack via user-supplied numeric redirect URLs
============================================================================================

Django relies on user input in some cases  (e.g.
:func:`django.contrib.auth.views.login` and :doc:`i18n </topics/i18n/index>`)
to redirect the user to an "on success" URL. The security check for these
redirects (namely ``django.utils.http.is_safe_url()``) considered some numeric
URLs (e.g. ``http:999999999``) "safe" when they shouldn't be.

Also, if a developer relies on ``is_safe_url()`` to provide safe redirect
targets and puts such a URL into a link, they could suffer from an XSS attack.

CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
=============================================================================

A maliciously crafted URL to a Django site using the
:func:`~django.views.static.serve` view could redirect to any other domain. The
view no longer does any redirects as they don't provide any known, useful
functionality.

Note, however, that this view has always carried a warning that it is not
hardened for production use and should be used only as a development aid.

Как это попробовать? Я недавно обновился до библиотеки, которую написал ранее (код слишком плох, чтобы ставить на него пари, я собираюсь недавно провести рефакторинг, не распыляйтесь)

git clone git@github.com:twocucao/YaPyLib.git
cd YaPyLib/
brew install pipenv
pipenv --three
pipenv install --dev
pipenv shell

Запомните несколько команд

pipenv --venv # 查看 venv 位置
pipenv --python 3.6.5
exit 退出 pipenv shell

При входе в проект запустите оболочку pipenv для автоматического источника среды. Ну, но я всегда чувствую, что если я поддерживаю 30 проектов, каждый раз, когда я открываю терминал, переходя в соответствующий каталог, а затем запускаю оболочку pipenv, это действительно проблематично.

Ну да, было бы неплохо, если бы этот процесс можно было автоматизировать.

Я предполагаю, что вы используете zsh, добавьте следующую конфигурацию в zsh.

function auto_pipenv_shell {
    if [ ! -n "${PIPENV_ACTIVE+1}" ]; then
        if [ -f "Pipfile" ] ; then
            pipenv shell
        fi
    fi
}

function cd {
    builtin cd "$@"
    auto_pipenv_shell
}

auto_pipenv_shell

Что касается других функций, пожалуйста, обратитесь к официальному сайту, чтобы изучить их самостоятельно.

Раздел часто задаваемых вопросов

В разделе FAQ есть очень интересный вопрос, нужно ли помещать файл блокировки в репозиторий git?

k Бог ответил да. На этот вопрос был дан ответ на вопрос давным-давно

https://github.com/pypa/pipenv/issues/598

Сначала я подумал, что лучше не отправлять, но потом решил, что можно будет отследить.

напиши в конце

При использовании npm/yarn для написания Node-программ/vuejs-приложений я особенно надеюсь, что подобный инструмент управления пакетами можно найти в среде Python. Позже я получил pipenv.В феврале этого года я перенес свой проект и обнаружил, что pipenv очень удобен в использовании.

pipenv — это будущий инструмент управления зависимостями для Python. Используйте его быстро.