Рубрики
Без рубрики

Публикация пакета Python: что я желаю покрыть лабиринт учебников

Я написал ряд пакетов Python с течением времени для моего собственного использования, и я так снег под Просто … помеченный Python, Pip, Pypi.

Я написал ряд пакетов Python с течением времени для моего собственного использования, и я настолько снег, просто делая его, что каждый раз, когда я остановился, чтобы подумать об этом, так что это может быть Пип Установлено, я искал онлайн и сразу же потерял среди десятков, сотни, возможно, гидов, учебников и вариантов и то, что выглядело как достаточное количество материала для докторской диссертации. И все это выглядело страшно, говорить о том, чтобы начать с нуля (не из существующего пакета), желая, чтобы я добавил и написал дюжину файлов и понять это и что, и хуже, есть старые способы, новые способы, альтернативные способы … AAARGH.

Но эй, мы в защелке 3 дня Lockdown здесь (спасибо Covid!) И я убирал некоторые проекты и попробовал еще раз … на этот раз, опыт в руке, (и меньше волос) Я подумал, что я бы поставил свои мигалки и использовать просто Официальное руководство:

https://packaging.python.org/tutorials/packaging-projects/

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

Итак, вот лучшее (ИМХО) руководство по упаковке вашего проекта Python и публиковать его (лучше, потому что он говорит, что я хотел знать, и я делаю разные ошибки, и у него есть свои недостатки, которые я не замечаю ;-).

Да, у меня уже есть пакеты … хорошие из них. Я хочу опубликовать их. Во всяком случае, пакет, конечно, это просто папка с __init__.py файл в нем, и если это небольшой пакет (как многие мои) Это все они есть. Ничего более, ничего меньше, чем папка с __init__.py В нем представляется некоторые классы и/или функции.

Иногда может быть еще несколько .py Файлы в папке рядом с __init__.py Отказ Незначительные детали, только что происходит, когда немного слишком большим, чтобы удобно поместиться в один файл.

Ключевая вещь здесь, мы не начинаем с нуля, но есть пакет.

Вам нужны только два инструмента, как это происходит, и они:

  • построить – Что создает из вашей упаковки по умолчанию A .tar.gz Файл и A .WHL Файл, который является тем, что хочет/потребности/потребности в этом Установить карьера.

  • шпагат – который публикует pypi.org

И так для подготовки:

pip install build twine

Не так уж плохо. Шаг 2 было легко.

Не много, не раздражайте.

  • Readme.md – Простой файл Markdown с приветственным сообщением и все, что вы хотите добавить. Что это за пакет, как вы его используете? Я использую Типора Но вы можете написать его в каком-либо текстовом редакторе, и он может быть максимально коротким или в глубине или глубине. Это то, что показано на странице Pypi.org для вашей пакеты, так что это также ваше объявление, если хотите для вашего посылки.

  • Лицензия .md – Не уверен, что вам нужно, но стоит делать и легко, как PY. Я зверю небрежно в этом пространстве и просто люблю Гиппократа лицензия Отказ Загрузите версию Markdown и сохраните ее как Лицензия

Вот и все! И думать, что это казалось так страшно в прошлом.

Учебник рекомендует выложить свою папку, как это (да, я немного упростил его):

the-folder-I-keep-it-in/
├── LICENSE
├── README.md
├── pyproject.toml
├── setup.cfg
└── src/
    └── my_package/
        └── __init__.py

Что нужно отметить:

  • Вам не нужно ставить это в SRC папка, но почему нет? Если это не сломалось, не исправьте это. SRC Стратегия означает, что вы можете просто перетащить пакет, откуда он был в SRC … сделано. Материал над ним – издательский комплект …

  • pyproject.toml и setup.cfg. Просто скажи построить и шпагат что делать. Мы вернемся к этим в ближайшее время. Первый – это просто стандартный файл, чтобы сказать построить что мы собираемся использовать шпагат в кольцевом пути 😉 А второй описывает вашу посылку Итак, шпагат Можно опубликовать его (пуристы могут спорить с этим аккуратным делением, но пусть они).

  • Папка The-Folder-I-It-it-in может иметь любое имя, которое вам нравится. не изменит ничего с постройки или публикации. Я на самом деле называю это мой пакет (В этом примере). Что касается того, чтобы продолжать читать. Это просто удобно, все все.

  • Папка my_package Следует использовать подчеркивание между словами, да, сделайте это. В мире Python есть странная путаница между my_package и мой пакет Отказ

my_package и мой пакет? Что, почему, когда?

Это описано нигде, и мне пришлось это работать с большим количеством пробных ошибок и волос, тянущих увы. Но вот что я получил для тебя.

  • my_package Просто придерживайтесь этого, не волнуй, никогда не колеблесь, используйте только это ;-). Я ребенку нет. Использование мой пакет В папке под Src. или в setup.cfg Приведет ли вам горе во время сборки, публикации, установки и тестирования.

  • Как только это опубликовано, это появится на Pypi.org как мой пакет И люди будут устанавливать его с PIP Установите мой пакет , но используйте его с Импортировать my_package. . Это просто так, что это так, это конвенция, не качающая лодка, все, что вам нужно знать, это вам не нужно поднять палец, чтобы сделать это, просто придерживаться my_package в SRC папка и в setup.cfg Отказ

  • Но, конечно, The-Folder-I-It-it-in здесь не имеет значения И я называю это мой пакет Только потому, что это то, что называется пакет. Единственным другим исключением является REPO GitHub, если вы используете один (и я делаю), что тоже может быть мой пакет И находится в моем деле на самом деле позже, которое вы сможете использовать, что для приятных двух строк установите сценарий.

pyproject.toml легко. Просто скопируйте стандарт. Поставить это в него:

[build-system]
requires = [
    "setuptools>=42",
    "wheel"
]
build-backend = "setuptools.build_meta"

И сделать с этим. Не больше не задавайте. Это построить внутренние органы и если вы не очень увлекаетесь в копании глубже, пусть он отдых, это просто означает, когда вы запускаете python3 -m build В папке вашей пакеты он знает, что делать (если у вас нет этого файла, он попросит один). Что это делает, создано Dist Папка и падает два файла в нем. Это то, что Хватина потребности

setup.cfg Не сложно, и вот мой минималистский взять и разъяснения, которые я чувствовал, не хватал в другом месте:

[metadata]
name = my_package
version = 0.1
author = my name
author_email = my email address
description = My little package
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/me/my-package
project_urls =
    Bug Tracker = https://github.com/me/my-package/issues
classifiers =
    Programming Language :: Python :: 3
    License :: Freely Distributable
    Operating System :: OS Independent
    Development Status :: 4 - Beta
    Framework :: Django :: 3.2
    Intended Audience :: System Administrators
    Topic :: Software Development :: Libraries :: Python Modules

[options]
install_requires =
    other_package1 >= 0.1.1
    other_package2 >= 2.0.1
package_dir =
    = src
packages = find:
python_requires = >=3.6

[options.packages.find]
where = src

И вот что я чувствовал, что должен был знать:

  • Имя следует использовать my_package. не мой пакет Отказ Просто верь мне. Вещи идут странно, если он говорит мой пакет Отказ Эксперимент, если вам нравится, я бы хотел, чтобы мне не нужно, и учебник был понятен здесь.
  • install_requires Хочет одну линию с отступом за требование с относительно знакомым синтаксисом (похоже на Пип заморозить – еще один из тех загадочных названных команд Python, который на самом деле означает PIP Show-Me-whats-state ). Это полностью пропущено в руководстве.
  • package_dir Странно, да, но забудьте это. Как install_requires. Он имеет список одного лайнера под ним, в этом случае только один. На одном вкладышах на карте имена пакетов в папки каким-либо образом во внутренних сложностях STYUPPOURTOOLS – детали большинство из них не заботятся или хотите знать о публикации нашего простого одного файлового пакета. Учебник говорит нам, что эта строка отображает пакет «Noname» для SRC Папка, и что пакет «NonAME» (это нечто до) является кодовым именем для всеобъемлющей корневой упаковки, поэтому SRC Папка становится мистической «корневой пакетом». У большинства из нас фактически заботится об этом? Что такое «корневой пакет»? в любом случае. Нах, давайте оставим это для BOFFINS, и просто принять это странный способ рассказывать строить и/или шпагат что наш пакет в SRC папка.
  • Там ничего не хватает после Найти: Отказ Нет. Это просто синтаксис, живут с ним. Обратитесь обратно в INTRO, RE: Мои чувства на ненужном воздействии загадочной природы публикации пакета Python … То же самое где , просто примите это.
  • Классификаторы немного громко, они должны прийти из списка разрешенные классификаторы . И они обреселье не хватает четкого способа сказать, что вы используете лицензию Гиппократа (которые я просто случится с любовью).

Публикация так же просто, как:

python3 -m twine upload dist/*

Но , это совершение. Как только вы опубликовали там, кажется, не удастся отменить это и Это потребляет использованные имена файлов (что означает также версию у вас есть в setup.cfg Как эти встроены в имена файлов Dist ).

И вот, тестирование в первую очередь имеет решающее значение. И pypi.org предоставляют testpypi в https://test.pypi.org/ Что вы можете свободно публиковать, так часто, как вам нужно правильно.

Основные вещания, которые требуют повторной попытки, находятся в моем опыте:

  • Вы смотрите на это на Pypi и Readme.md имеет проблемы. Либо опечатки, либо строки кода, которые слишком длинные и рендеры плохо и т. Д. В любом случае, вы видите, как он собирается представить на Pypi и может настроить ваш README, чтобы выглядеть хорошо.

  • Ваш тест, установив его с PIP, не работает. Который на самом деле не бывает сейчас, когда у меня есть рабочий процесс, но произошло много Пока я пытался все это работать setup.cfg Синтаксис, что учебное пособие устанавливает блеск.

Чтобы опубликовать на сайте теста, это просто небольшой вариант:

python3 -m twine upload --repository testpypi dist/*

Уловы

Так что тестирование великолепно. Спасатель. Но это заставило меня тоже немного скромного горе (оборотная сторона той же монеты).

Во-первых, вам нужно создать учетную запись на сайте, и я сделал это, но использовать Bitwarden Всегда, и генерируйте большие случайные пароли для меня – привычка (что мы все должны иметь).

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

К счастью, они могут быть предоставлены в командной строке, как в:

python3 -m twine upload --repository testpypi -u $username -p $password dist/*

И я спас это в файле под названием test-publish что читает:

#!/bin/bash
source ~/.auth/pypi.auth
python3 -m twine upload --repository testpypi --verbose -u $username -p $password dist/*

Во-вторых, вы не можете опубликовать. Вообще. Вам нужно увеличить Версия в setup.cfg и восстановить, прежде чем вы сможете переиздавать. Замедляет вещи некоторыми. Не в последнюю очередь из-за времени и энергии, потраченного в поисках онлайн для способов и средств для передачи. Некоторые Онлайн источники Предложить - Существующие делает трюк, но это не так не для меня и неясно, что это делает или что это для И, может быть, я просто неправильно просил. C’est. жизнь.

В-третьих, зависимости, перечисленные в соответствии с install_requires. в setup.cfg Не работай, предположительно, потому что при тестировании необходимых пакетов не на https://test.pypi.org/ . Но потребовалось немного головы, почесывающую и попытаю попытку попытаться убедить себя в том, что, как я пытался поверить или не проверять синтаксис только для того, чтобы она не описана в руководстве и отправила меня на этот Уоррен Другие источники быстро снова. Я желаю, чтобы TESTPEYI посмотрел на Pypi для требований в качестве отблески, поэтому этот тестовый цикл может быть завершен.

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

В основном сценарий сборки и два сценария публикации и установки.

Чтобы:

Скрипт для строительства: построить :

#!/bin/bash
rm dist/*
python3 -m build

Сценарий для тестирования публикации: test-publish :

#!/bin/bash
source ~/.auth/pypi.auth
python3 -m twine upload --repository testpypi  --verbose -u $username -p $password dist/*

Сценарий для установки Test Publish (Test Installing) – отмечая, что ошибки здесь о требованиях, которые не могут быть выполнены: Test-install :

#!/bin/bash
package=$(basename $(dirname $(readlink -f "$0")))
python -m pip install --index-url https://test.pypi.org/simple/ $package

Сценарий для правильной публикации: Опубликовать :

#!/bin/bash
source ~/.auth/pypi.auth
python3 -m twine upload --verbose -u $username -p $password dist/*

Сценарий для правильной установки пакета: Установить :

#!/bin/bash
package=$(basename $(dirname $(readlink -f "$0")))
python -m pip install $package

Основной пример того, что вместе вы можете посетить:

https://github.com/bernd-wechner/django-model-admin-fields

И посмотрите здесь:

https://pypi.org/project/django-model-admin-fields/

Я надеюсь, что это поможет кому-нибудь сохранить все хлопоты в обучении и публиковать что-то легко, просто добавив 4 файла в папку (A readme.md для записи, a icense.md скачать, а pyproject.toml копировать и setup.cfg Настроить) и, возможно, 5 крошечных маленьких помощников скриптов Bash и в кратчайшие сроки проводится тест, а затем опубликовал цикл.

Оригинал: “https://dev.to/thumbone/publishing-a-python-package-what-i-wish-the-maze-of-tutorials-covered-1838”