Как я могу заставить setuptools игнорировать инвентарь Subversion? - PullRequest
20 голосов
/ 15 июля 2009

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

from setuptools import setup
...

исходный дистрибутив, созданный с помощью:

python setup.py sdist

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

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 15 июля 2009

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

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

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

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

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

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

9 голосов
/ 25 декабря 2009

Создайте файл 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.

1 голос
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

Я бы сказал, что стандартное поведение sdist правильное. Когда вы создаете дистрибутив source , я ожидаю, что он будет содержать все , зарегистрированное в 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.

0 голосов
/ 15 июля 2009

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

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...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...