Я написал ряд пакетов 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”