Как избавиться от существующей папки dist (или файлов в папке) после сборки пакета Python, чтобы избежать конфликтов с использованием файлов?

Вопрос или проблема

Я работаю над пакетом для 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 перед сборкой. Создание простых скриптов – это отличный способ упростить ваш рабочий процесс и избежать ручной работы. Пожалуйста, укажите в документации вашего проекта о том, как выполнять эти операции, чтобы другие разработчики могли легко следовать вашему примеру.

Оцените материал
Добавить комментарий

Капча загружается...