Как я могу заставить setuptools игнорировать инвентарь Subversion?

StackOverflow https://stackoverflow.com/questions/1129180

Вопрос

При упаковке пакета Python с помощью файла setup.py, который использует инструменты настройки:

from setuptools import setup
...

исходный дистрибутив, созданный:

python setup.py sdist

не только включает, как обычно, файлы, указанные в MANIFEST.in, но также, безвозмездно, включает все файлы, которые Subversion считает контролируемыми версиями в каталоге пакета.Это сильно раздражает.Это не только затрудняет какой-либо явный контроль над тем, какие файлы распространяются вместе с моим пакетом, но и означает, что, когда я собираю свой пакет после «экспорта svn» вместо «извлечения svn», содержимое моего пакет может быть совершенно другим, поскольку без метаданных .svn инструменты настройки будут делать разные выборы относительно того, что включать.

Мой вопрос:как я могу отключить это ужасное поведение, чтобы «setuptools» обрабатывал мой проект одинаково, независимо от того, использую ли я Subversion, или контроль версий, о котором он никогда не слышал, или голое дерево, созданное с помощью «svn-экспорта», которое я создал в конце моего проекта, чтобы убедиться, что он собирается правильно где-то помимо моего рабочего каталога?

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

from setuptools.command import sdist
del sdist.finders[:]

Но это Python, а не джунгли, поэтому, конечно, мне нужно лучшее решение, вообще не связанное с обезьянами.Как я могу приручить инструменты настройки, отключить их магию и заставить их вести себя разумно, вместо этого просматривая видимые, предсказуемые правила в моем MANIFEST.py?

Это было полезно?

Решение

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

Проблема здесь в том, что сам setuptools включает в себя довольно много черной магии, включая использование точки входа под названием setuptools.file_finders, куда вы можете добавлять плагины для поиска файлов для включения.Однако я совершенно не понимаю, как УДАЛИТЬ из него плагины...

  • Быстрый обходной путь:svn экспортируйте ваш пакет во временный каталог и запустите оттуда setup.py.Это означает, что у вас нет svn, поэтому средство поиска svn не находит файлов для включения.:)

  • Более длинный обходной путь:Вам действительно нужны инструменты настройки?Инструменты настройки имеют множество функций, поэтому ответ, скорее всего, положительный, но в основном эти функции — это зависимости (поэтому ваши зависимости устанавливаются с помощью easy_install), пакеты пространства имен (foo.bar) и точки входа.Пакеты пространства имен также могут быть созданы без инструментов настройки.Но если вы не используете ничего из этого, вам может сойти с рук просто использование distutils.

  • Уродливый обходной путь:Monkeypatch, который вы указали sdist в своем вопросе, просто делает плагин не имеющим средств поиска и быстро завершает работу.

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

Другие советы

Создайте файл MANIFEST.in с помощью:

recursive-exclude .
# other MANIFEST.in commands go here
# to explicitly include whatever files you want

Видеть http://docs.python.org/distutils/commandref.html#sdist-cmd для синтаксиса MANIFEST.in.

Вероятно, ответ находится в вашем setup.py.Вы используете find_packages?Эта функция по умолчанию использует VCS (например.подрывная деятельность, hg, ...).Если вам это не нравится, просто напишите другую функцию Python, которая собирает только то, что вам нужно.

Я бы сказал, что поведение sdist по умолчанию правильное.Когда вы строите источник дистрибутив, я ожидаю, что он будет содержать все это проверено в Subversion.Конечно, было бы неплохо иметь возможность полностью переопределить его в особых обстоятельствах.

Сравните sdist с bdist_egg;Могу поспорить, что будут включены только те файлы, которые указаны явно.

Я провел простой тест с тремя файлами, все в svn.Пустые файлы dummy.lkj и foobar.py, а файл setup.py выглядит так:

import setuptools
setuptools.setup(name='foobar', version='0.1', py_modules=['foobar'])

sdist создает архив, содержащий dummy.lkj.bdist_egg создает яйцо, не содержащее dummy.lkj.

Вероятно, вы хотите что-то вроде этого:

from distutils.core import setup

def packages():
    import os

    packages = []

    for path, dirs, files in os.walk("yourprogram"):
        if ".svn" in dirs:
            dirs.remove(".svn")

        if "__init__.py" in files:
            packages.append(path.replace(os.sep, "."))

    return packages

setup(
    # name, version, description, etc...

    packages = packages(),

    # pacakge_data, data_files, etc...
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top