setuptools / easy_install не устанавливает файлы * .cfg и каталоги локали?

У меня небольшая проблема с setuptools / easy_install; может быть, кто-нибудь подскажет, в чем может быть причина проблемы:

Чтобы легко распространить одно из моих веб-приложений на python на серверы, я использую команду setuptools sdist для создания файла tar.gz, который копируется на серверы и устанавливается локально с помощью easy_install /path/to/file.tar.gz.

Пока что это работает отлично. Я перечислил все в MANIFEST.in файле так:

global-include */*.py */*.mo */*.po */*.pot */*.css */*.js */*.png */*.jpg */*.ico */*.woff */*.gif */*.mako */*.cfg

И полученный файл tar.gz действительно содержит все нужные мне файлы.

Странно, как только easy_install пытается установить его в удаленной системе. По какой-то причине каталог с именем locales и файл конфигурации с именем migrate.cfg не устанавливаются. Это странно, и я не могу найти никаких документов по этому поводу, но я предполагаю, что это какая-то функция автоматического игнорирования easy_install?

Есть что-то подобное? И если да, то как мне получить easy_install для установки файлов locales и migrate.cfg?

Спасибо!

Для справки вот содержание моего setup.py:

from setuptools import setup, find_packages


requires = ['flup', 'pyramid', 'WebError', 'wtforms', 'webhelpers', 'pil', 'apns', \
            'pyramid_beaker', 'sqlalchemy', 'poster', 'boto', 'pypdf', 'sqlalchemy_migrate', \
            'Babel']

version_number = execfile('pubserverng/version.py')

setup(
    author='Bastian',
    author_email='[email protected]',
    url='http://domain.de/',
    name = "mywebapp",
    install_requires = requires,
    version = __version__,
    packages = find_packages(),
    zip_safe=False,
    entry_points = {
        'paste.app_factory': [
            'pubserverng=pubserverng:main'
        ]
    },

    namespace_packages = ['pubserverng'],

    message_extractors = { 'pubserverng': [
            ('**.py', 'python', None),
            ('templates/**.html', 'mako', None),
            ('templates/**.mako', 'mako', None),
            ('static/**', 'ignore', None),
            ('migrations/**', 'ignore', None), 
        ]
    },


)

person BastiBen    schedule 24.02.2012    source источник


Ответы (3)


Я не хочу так быстро отвечать на свой вопрос, но после некоторых проб и ошибок я выяснил, в чем причина отсутствия файлов. На самом деле причин было несколько:

  • Файл SOURCES.txt был старше и включал полный список большинства файлов, что привело к их правильному объединению.
  • Файл MANIFEST.in тоже был правильным, поэтому все необходимые файлы, как и ожидалось, фактически находились в архиве .tar.gz. Основная проблема заключалась в том, что некоторые файлы просто не могли быть установлены на целевой машине.
  • Мне пришлось добавить include_package_data = True, в мой файл setup.py. После этого все файлы были установлены должным образом.

Мне нужно провести некоторое исследование include_package_data, чтобы выяснить, не задокументировано ли где-нибудь это странное поведение. setuptools - настоящий беспорядок, особенно документация.

person BastiBen    schedule 24.02.2012
comment
Это может быть то, что вы хотите, а может и нет .. :-) Все include_package_data = True означает, что setuptools должны устанавливать файлы в каталоги пакетов, которые не известны python как связанные с пакетом. Установка этого параметра означает, что теперь вы должны быть очень осторожны, чтобы убедиться, что MANIFEST.in исключает файлы, которые вы не хотите включать (и обновляется, когда люди добавляют файлы). - person Nick Bastin; 24.02.2012

Вся система распространения пакетов в python оставляет желать лучшего. Мои проблемы были похожи на ваши, и в конечном итоге они были решены с помощью distutils (а не setuptools), который соответствовал настройке include_package_data = True, как и ожидалось.

Использование distutils позволило мне более или менее сохранить требуемый список файлов в MANIFEST.in и избежать использования параметра package_data, когда мне пришлось бы дублировать исходный список; обратный ход find_packages недоступен. Ниже мой setup.py:

from distutils.core import setup
package = __import__('simplemenu')

setup(name='django-simplemenu',
    version=package.get_version(),
    url='http://github.com/danielsokolowski/django-simplemenu',
    license='BSD',
    description=package.__doc__.strip(),
    author='Alex Vasi <[email protected]>, Justin Steward <[email protected]>, Daniel Sokolowski <[email protected]>',
    author_email='[email protected]',
    include_package_data=True, # this will read MANIFEST.in during install phase
    packages=[
        'simplemenu',
        'simplemenu.migrations',
        'simplemenu.templatetags',
    ],
    # below is no longer needed as we are utilizing MANIFEST.in with include_package_data setting
    #package_data={'simplemenu': ['locale/en/LC_MESSAGES/*', 
    #                             'locale/ru/LC_MESSAGES/*']
    #              },
    scripts=[],
    requires=[],
    )

А вот и MANIFEST.in файл:

    include LICENSE
    include README.rst
    recursive-include simplemenu *.py
    recursive-include simplemenu/locale *
    prune simplemenu/migrations
person Daniel Sokolowski    schedule 21.08.2012

Вам необходимо использовать data_files функциональные возможности setup - ваши файлы не код, поэтому easy_install не будет устанавливать их по умолчанию (он не знает, куда они идут).

Плюс в том, что эти файлы добавляются в МАНИФЕСТ автоматически - вам не нужно делать какие-либо чудеса, чтобы получить их самостоятельно. (В общем, если МАНИФЕСТА, автоматически сгенерированного setup.py, недостаточно, добавление их самостоятельно не приведет к их установке волшебным образом.)

person Nick Bastin    schedule 24.02.2012
comment
Вот почему я использую файл MANIFEST.in, и он работает для большинства файлов данных, таких как шаблоны PNG и .mako. Так что это странно. - person BastiBen; 24.02.2012
comment
Смотрите мой собственный ответ. Похоже, что include_package_data отсутствует. - person BastiBen; 24.02.2012
comment
@badcat: См. мой комментарий - я бы сказал, что в целом include_package_data не та функция, которую вы хотите использовать - я считаю, что упаковка намного более разумна, когда вы вынуждены явно включать файлы данных, которые вы хотите отправить, а не исключать файлы данных вы не хотите отправлять. - person Nick Bastin; 24.02.2012
comment
Это как раз моя точка зрения. Поскольку я использую git, автоматическая упаковка все равно не работает. Но что действительно странно, так это тот факт, что include_package_data должен быть True, чтобы даже определенные вручную шаблоны из MANIFEST.in были установлены на целевой машине. - person BastiBen; 26.02.2012
comment
@badcat: MANIFEST.in просто указывает, что попадает в исходный дистрибутив при запуске sdist - это не имеет ничего общего с тем, что устанавливается. setup все еще нужно указать, где установить эти файлы. - person Nick Bastin; 26.02.2012
comment
Ах, это не совсем понятно. Я думал, что все, что попало в файл .tar.gz, будет установлено позже. Однако вся документация - настоящий беспорядок; очень сложно разобраться в таких деталях - person BastiBen; 26.02.2012