Как документировать требования - PullRequest
1 голос
/ 26 января 2020

Когда я программирую, я часто экспериментирую со сторонними пакетами. Конечно, они устанавливаются через пипс. После установки пакеты устанавливают свои зависимости.

В конце я хочу получить чистый файл require.txt, отражающий, какие пакеты действительно необходимы для проекта (pip freeze> needs.txt).

Если мне удастся найти лучшее решение для пакета, я удаляю его через pip. Проблема в том, что при удалении пакет не удаляет свои зависимости. Если я не ошибаюсь, это не так. Ну, а когда я делаю pip freeze , я не могу распознать, что здесь происходит.

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

Но это действительно хлопотно и подвержено ошибкам:

pip freeze > requirements.txt

asgiref==3.2.3
Django==3.0.2
pkg-resources==0.0.0
pytz==2019.3
sqlparse==0.3.0

Редактировать файл require.txt:

asgiref==3.2.3 # Django dependency
Django==3.0.2 # Django
pkg-resources==0.0.0 # Default package
pytz==2019.3 # Django dependency
sqlparse==0.3.0 # Django dependency

При установке В новом пакете я делаю pip freeze> needs1.txt. Затем сравните файлы, покажите зависимости вновь установленного пакета, отметьте их, затем скопируйте и вставьте старые комментарии.

Ну, наконец, я могу просто сделать это полным беспорядком. Я делаю стоп-кадр и понимаю, что просто не знаю, какой пакет зависит от чего, поскольку я просто забываю комментировать или что-то в этом роде.

Опять же, это моя цель: когда я заканчиваю sh мой проект в год, я хотел бы знать точно, что:

  1. Каждый установленный пакет абсолютно необходим для запуска проекта.
  2. Никаких ненужных пакетов не установлено.

Не могли бы вы сказать, как лучше всего это сделать?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Кажется, pip-tools - это именно тот инструмент, который вам нужен для решения проблем, с которыми вы столкнулись в процессе разработки.

pip-tools позволяет вам указать свои высокоуровневые зависимости ( например, Django), при этом автоматически заботясь о ваших низкоуровневых зависимостях (например, pytz). Он также позволяет синхронизировать c вашей среды с файлом requirements.txt независимо от того, в каком беспорядочном состоянии вы можете быть.

Установка pip-tools в вашем проекте

Для использования pip-tools, сначала создайте новую пустую виртуальную среду Python в своем проекте и активируйте ее, используя инструмент по вашему выбору:

  • с venv (встроенный): python3 -m venv .venv && source .venv/bin/activate
  • с pyenv : pyenv virtualenv 3.8.1 project-env && pyenv local project-env

Затем установите pip-tools в виртуальной среде Python вашего проекта:

  • pip install pip-tools

Управление зависимостями с помощью pip-compile с использованием файла requirements.in

pip-tools включает в себя инструмент pip-compile, который принимает requirements.in файл в качестве ввода. Этот requirements.in файл похож на requirements.txt, но содержит только высокоуровневые зависимости. Например, если ваш проект использует последнюю версию Django, вы можете написать что-то вроде этого в requirements.in:

django>=3.0,<3.1

Вы можете видеть, что requirements.in не содержит зависимостей Django, только Django.

Как только вы установите свои зависимости в requirements.in, используйте pip-compile, чтобы "скомпилировать" requirements.in в requirements.txt файл:

➜ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile requirements.in
#
asgiref==3.2.3            # via django
django==3.0.2
pytz==2019.3              # via django
sqlparse==0.3.0           # via django

Файл requirements.txt, сгенерированный pip-compile, указывает источник каждой косвенной зависимости рядом с именем пакета. Например, pytz==2019.3 является зависимостью django. В дополнение к этому, он также прикрепляет каждую зависимость к точному номеру версии, чтобы убедиться, что установка ваших зависимостей воспроизводима

Применение зависимостей из сгенерированных requirements.txt с помощью pip-sync

Теперь, когда у вас есть requirements.txt, вы можете применить его в вашей виртуальной среде Python, используя pip-sync:

➜ pip-sync requirements.txt
Collecting asgiref==3.2.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 1))
  Using cached https://files.pythonhosted.org/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl
Collecting django==3.0.2 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 2))
  Using cached https://files.pythonhosted.org/packages/55/d1/8ade70e65fa157e1903fe4078305ca53b6819ab212d9fbbe5755afc8ea2e/Django-3.0.2-py3-none-any.whl
Collecting pytz==2019.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 3))
  Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
Collecting sqlparse==0.3.0 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 4))
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Installing collected packages: asgiref, pytz, sqlparse, django
Successfully installed asgiref-3.2.3 django-3.0.2 pytz-2019.3 sqlparse-0.3.0

pip-sync, чтобы убедиться, что ваша виртуальная среда точно соответствует тому, что определено в файл requirements.txt путем удаления и установки соответствующих пакетов.

После синхронизации среды убедитесь, что код проекта работает правильно. Если это так, передайте requirements.in и requirements.txt в систему управления версиями.

Ссылка

Для получения более подробной информации вы можете обратиться к документам pip-tools , или к статье Хинека Шлавака: Python Управление зависимостями приложений в 2018 .

1 голос
/ 26 января 2020

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

  1. создать виртуальная среда в каталоге вашего проекта

    $ python3 -m venv .venv
    
  2. Активируйте вашу виртуальную среду

    $ source .venv/bin/activate
    
  3. Установите все пакеты, с которыми вы играете

    $ echo "package1" >> requirements-dev.txt
    $ echo "package2" >> requirements-dev.txt
    $ pip install --upgrade -r requirements-dev.txt
    
  4. Когда вы считаете, что у вас есть все, что вам нужно, деактивируйте виртуальную среду, создайте новую, убедитесь, что все по-прежнему работает, а затем создайте новые требования. Txt

    $ deactivate
    $ rm -rf .venv
    $ python3 -m venv .venv
    $ pip install --upgrade -r requirements-dev.txt
    # test your code still works
    # create a new requirements file to be used for "prod"
    $ pip freeze > requirements.txt
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...