Как опубликовать консольную утилиту на PyPI за 1 минуту

Разработав консольную утилиту, вы решаетесь опубликовать её на PyPI. Ну правда, что может быть лучше, чем сделать её доступной через pip install? Погуглив, что для этого надо, вы, возможно, наткнётесь на единственный найденный мной пост по теме, который мало того что от 2014 года, так ещё и требует от вас создать кучу папок и файлов для совершенно ненужных (вам) вещей.



Как же решить эту задачу без лишней головной боли в 2019 году? Я уже задавался этим вопросом и поэтому, прочитав тонну документации, создал для вас этот туториал. Вот пошаговая инструкция.



1. Создайте аккаунт на PyPI (ссылка для регистрации)



2. Создайте точку входа в приложение (например, файл entry.py со следующим содержимым)



def main():
    print("It's alive!")


3. Установите poetry



curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
source $HOME/.poetry/env


(poetry можно установить и по-другому, например, pip install --user poetry — прим. перев.)



4. Создайте окружение



cd myproject # Перейдите в папку проекта, который будем паковать
poetry init


5. Настройте консольную команду (для этого добавьте следующие строки в появившийся файл pyproject.toml)



[tool.poetry.scripts]
APPLICATION-NAME = 'entry:main'


APPLICATION-NAME надо поменять на имя консольной команды.



6. Опубликуйте утилиту! (используйте имя пользователя и пароль из шага 1)



poetry publish --username PYPI_USERNAME --password PYPI_PASS --build


Готово! Теперь другому человеку для установки достаточно всего двух команд:



$ sudo pip install PROJECT-NAME
$ APPLICATION-NAME


Где PROJECT-NAME — это имя, которое вы дали проекту на шаге 4, а APPLICATION-NAMEэто имя команды из шага 5.






Обновление версии



Всякий раз, когда вы хотите обновить модуль, просто измените номер версии в файле pyproject.toml:



version = "0.1.0"


И повторите шаг 6:



poetry publish --username PYPI_USERNAME --password PYPI_PASS --build





Бонус: настраиваем Travis для авто-публикации



Добавьте следующие строки в файл .travis.yml



language: python
dist: xenial
before_install:
  - curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
  - source $HOME/.poetry/env
install:
  - poetry install
script:
  - poetry build
deploy:
  - provider: script
    skip_cleanup: true
    script: poetry publish --username $PYPI_USER --password $PYPI_PASS
    on:
      branch: master
      python: '3.7'
      tags: true


И установите переменные окружения PYPI_USER и PYPI_PASS на travis-ci.com. После этого можно будет публиковать пакет с помощью команд:



git tag -a v1.2 # Replace version number with yours
git push --tags

Poetry: новый менеджер зависимостей в Python
В последнее время в экосистеме Python часто стали появляться инструменты для управления зависимостями. Оно понятно, стандартный pip уже не отвечает современным требованиям: неудобная работа с зависимостями, много ручной работы при подготовке пакетов, проблемы при установке и обновлении и много чего другого.

С недавних пор я начал использовать новый менеджер под названием Poetry. Именно о нём сегодня пойдёт речь.


Функциональные возможности Poetry:



  • Управление зависимостями через toml файл (прощай, requirements.txt)

  • Автоматическое создание изолированного виртуального окружения Python (теперь не нужно для этого вызывать virtualenv)

  • Удобное создание пакетов (отныне не нужно копипастить создавать setup.py каждый раз)

  • poetry.lock файл для фиксирования версий зависимостей


А особенно радует тандем при работе с pyenv. О pyenv я писал три года назад.




Установка


Исходный код проекта лежит на github. Для установки необходимо выполнить команду:






curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

Если установка прошла успешно, то убедиться в этом можно вызвав:


$ poetry --version
Poetry 0.12.8

Стартуем!


Создаём новый проект my-demo-project:


$ poetry new my-demo-project

Заходим в папку:


$ cd my-demo-project/
~/my-demo-project$ ls
README.rst my_demo_project pyproject.toml tests

Poetry автоматически создал все необходимые файлы для будущего пакета, но наибольший интерес представляет файл с названием pyproject.toml, этот файл можно рассматривать как продвинутую альтернативу старичку requirements.txt. Взглянем на содержимое:


[tool.poetry]
name = "my-demo-project"
version = "0.1.0"
description = ""
authors = ["Your Name you@example.com"]

[tool.poetry.dependencies]
python = "^3.6"

[tool.poetry.dev-dependencies]
pytest = "^3.0"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Формат файла TOML. Раздел tool.poetry предназначен для описания проекта: название, версия, краткая информация о проекте и т.д. Далее следует tool.poetry.dependencies, именно здесь будут указаны все production зависимости. Их можно указать вручную (привет, requirements.txt), но мы так делать не будем (привет, npm!). Раздел tool.poetry.dev-dependencies предназначен для зависимостей во время разработки (привет, pytest, tox!)


Добавляем зависимости


Давайте добавим к проекту зависимость в виде Luigi.


~/my-demo-project$ poetry add luigi==2.8.0

Creating virtualenv my-demo-project-py3.6 in /home/user/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (24.1s)

Package operations: 12 installs, 0 updates, 0 removals

Writing lock file
  - Installing docutils (0.14)
  - Installing lockfile (0.12.2)
  - Installing six (1.11.0)
  - Installing atomicwrites (1.2.1)
  - Installing attrs (18.2.0)
  - Installing more-itertools (4.3.0)
  - Installing pluggy (0.8.0)
  - Installing py (1.7.0)
  - Installing python-daemon (2.1.2)
  - Installing tornado (4.5.3)
  - Installing luigi (2.8.0)
  - Installing pytest (3.10.1)

Обратите внимание, что Poetry автоматически создал виртуальное окружение через virtualenv при добавлении пакета (т.к. ранее оно не было создано). Все окружения находятся по пути ~/.cache/pypoetry/virtualenvs


Если снова открыть pyproject.toml, то можно увидеть новую запись в разделе зависимостей:


[tool.poetry.dependencies]
python = "^3.6"
luigi = "=2.8.0"

Всю "грязную" работу за нас делает Poetry. Чтобы добавить зависимость для разработки достаточно указать флаг —dev:


$ poetry add tox --dev

Using version ^3.5 for tox
Updating dependencies
Resolving dependencies... (6.3s)
Package operations: 4 installs, 0 updates, 0 removals

Writing lock file
  - Installing filelock (3.0.10)
  - Installing toml (0.10.0)
  - Installing virtualenv (16.1.0)
  - Installing tox (3.5.3)

Смотрим содержимое pyproject.toml ещё раз:


[tool.poetry.dev-dependencies]
pytest = "^3.0"
tox = "^3.5"

Чтобы удалить зависимость нужно выполнить:


~/my-demo-project$ poetry remove luigi

Сборка пакета


Отныне забудьте про головную боль с ручным созданием setup.py, прописыванием туда всех зависимостей и запоминанием команд для сборки через pip. Всё стало в разы проще. Чтобы собрать python пакет выполните:


~/my-demo-project$ poetry build

Building my-demo-project (0.1.0)
 - Building sdist
 - Built my-demo-project-0.1.0.tar.gz
 - Building wheel
 - Built my_demo_project-0.1.0-py3-none-any.whl

В папке dist будут сформированы пакеты. Чтобы поделиться своим творением с другими разработчиками, например через pypi, выполните:


~/my-demo-project$ poetry publish

Окружение


Для активации виртуального окружения необходимо выполнить команду:


~/my-demo-project$ poetry shell

Вывод


Проект Poetry появился 28 февраля 2018 года, последняя версия 0.12.8. Инструмент молодой, но перспективный и быстроразвивающийся. Уже сейчас он на голову выше старичка pip и по функциональным возможностям и по удобству использования. Советую вам его попробовать и поделиться мнением в комментариях к этой статье. За более подробной информацией об инструменте советую заглянуть на сайт с документацией.



https://pypi.org/project/poetry/
https://poetry.eustace.io/docs/
Goodbye Virtual Environments?

Date: 2019-06-17 01:40 pm (UTC)From: [identity profile] lj-frank-bot.livejournal.com
Здравствуйте!
Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категориям: IT (https://www.livejournal.com/category/it), Здоровье (https://www.livejournal.com/category/zdorove).
Если вы считаете, что система ошиблась — напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее.
Фрэнк,
команда ЖЖ.

Date: 2019-06-18 08:39 am (UTC)From: [identity profile] uzverss.livejournal.com
у меня весь дневник относится к категории IT
насчёт здоровья записей не было

Date: 2019-06-18 08:42 am (UTC)From: [identity profile] lj-frank-bot.livejournal.com
Упс.

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 23rd, 2025 07:05 am
Powered by Dreamwidth Studios