Вопрос или проблема
Я работаю над пакетом для Python и в настоящее время вручную собираю и загружаю мой пакет (на testpypi) каждый раз, когда вношу изменения. Я использую setuptools в качестве бэкенда и twine для загрузки сборок. Каждый раз, когда я запускаю python -m build
, создается папка dist
с файлами tar.gz
и whl
. Если я изменяю версию сборки, у меня получаются файлы с совершенно новыми именами версий, но старые файлы все еще остаются:
dist
package-0.0.1-none-any-py3.whl
package-0.0.1.tar.gz
package-0.0.2-none-any-py3.whl
package-0.0.2.tar.gz
Когда я запускаю команду twine upload dist/*, загружаются как старые, так и новые файлы. И поскольку старые файлы имеют те же имена, что и новые, загрузка отклоняется из-за повторного использования имен файлов. В результате мне приходится вручную очищать папку dist.
Я знаю, что есть команда setup.py clean
, но я не совсем уверен, что она делает, и она выдаёт ошибку после её выполнения.
Есть ли способ избежать этого? Мне просто нужно создать батник, который автоматизирует очистку, или есть какая-то настройка или команда, которую я пропустил?
Ответ или решение
Чтобы избежать конфликтов файлов при сборке вашего Python-пакета и обеспечить чистоту папки dist
, вы можете использовать несколько подходов. Ключевая задача заключается в том, чтобы автоматически удалять старые сборки перед созданием новых. Вот несколько методов, как это можно сделать:
1. Использование setuptools
с clean
командой
Как вы упомянули, команда setup.py clean
может быть использована, но по умолчанию она не удаляет содержимое папки dist
. Для того чтобы использовать clean
, вам может потребоваться настроить дополнительные параметры в вашем setup.py
. Однако, эта команда может не решить вашу проблему полностью, поэтому лучше использовать другие методы.
2. Использование скриптов для очистки
Рекомендуется создать простой скрипт, который будет удалять содержимое папки dist
перед каждым запуском сборки. Например, вы можете создать файл clean_and_build.bat
(если вы используете Windows) с таким содержимым:
@echo off
REM Удаление каталога dist
if exist dist (
rmdir /s /q dist
)
REM Создание новой сборки
python -m build
REM Дополнительно: загрузка на PyPI
REM twine upload dist/*
Для систем на базе Unix (Linux, MacOS) можно использовать аналогичный скрипт на Shell:
#!/bin/bash
# Удаление каталога dist
if [ -d "dist" ]; then
rm -rf dist
fi
# Создание новой сборки
python -m build
# Дополнительно: загрузка на PyPI
# twine upload dist/*
3. Использование инструмента find
Если вы хотите еще больше автоматизировать процесс, и если ваш текущий метод сборки по каким-то причинам не подходит, вы можете использовать команду find
для выбора и удаления только тех файлов, которые соответствуют определенным шаблонам. Например:
find dist -type f -name "*.whl" -o -name "*.tar.gz" -exec rm -f {} +
4. Использование конфигурации pyproject.toml
Если вы используете pyproject.toml
, вы также можете ознакомиться с пакетом Flit
или Poetry
, которые могут предложить более надежные механизмы управления зависимостями и публикацией пакетов, включая возможность автоматической очистки ненужных файлов.
Заключение
Подводя итог, самым простым и эффективным способом избежать проблемы с конфликтами файлов при каждом построении является автоматизация удаления папки dist
перед сборкой. Создание простых скриптов – это отличный способ упростить ваш рабочий процесс и избежать ручной работы. Пожалуйста, укажите в документации вашего проекта о том, как выполнять эти операции, чтобы другие разработчики могли легко следовать вашему примеру.