Как включить package_data без файла MANIFEST.in?

Как включить package_data для sdist без файла MANIFEST.in?

My setup.py выглядит так:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),

    package_data={'': ['foo/bar.txt']},
)

Версии:

[email protected]> python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools
>>> setuptools.version.__version__
'3.6'

Я просто не могу включить foo/bar.txt.

Или это сообщение в блоге все еще верно? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging-documentation-on--package_data-/

В течение последнего часа я узнал, что эти утверждения находятся где-то между "опасно обманчивыми" и "проклятой ложью". Это связано с тем, что основной тип пакета Python является исходным пакетом, а канонический метод создания исходного пакета - с помощью setup.py sdist. Однако данные, указанные в package_data, не включены в дистрибутивы источников - они включены только в дистрибутивы двоичных (setup.py bdist) и устанавливаются (setup.py install).

Как включить package_data для sdist без файла MANIFEST.in?

Ответ 1

TL; DR: ключи в словарях package_data - это пакеты; значения - это списки глобусов. '' не является допустимым именем для любого пакета Python.

Если вы хотите установить bar.txt рядом с __init__.py пакета foo, используйте

 package_data={'foo': ['bar.txt']}

У меня есть макет:

foo/
        __init__.py
        bar.txt
setup.py

Теперь, если foo - это пакет, как указано выше, выполните:

import setuptools

setuptools.setup(
    name='foo',
    version='2015.3',
    license='commercial',
    packages=setuptools.find_packages(),
    package_data={'foo': ['bar.txt']},
)

И после python setup.py sdist, я проверяю содержимое dist/foo-2015.3.tar.gz

% tar tfz dist/foo-2015.3.tar.gz
...
foo-2015.3/foo/bar.txt
...

Однако, если я запустил ваш setup.py с помощью package_data={'': ['foo/bar.txt']}, я могу согласиться, что foo/bar.txt не будет добавлен в исходный дистрибутив, за исключением того, что если foo-2015.3.egg-info/SOURCES.txt уже имеет строку для foo/bar.txt - в в этом случае файл также появится в дистрибутиве источника

Никакой манифест не использовался; версия setuptools была 3.6 (я специально установил ту же самую старую версию, которую вы использовали):

>>> import setuptools
>>> setuptools.__version__
'3.6'

Поведение выше также работает в стандартном distutils: 2.6 Установка данных пакета в документацию "наследие" distutils; с комментарием для 2.7, 3.1:

Изменено в версии [2.7, 3.1]: все файлы, соответствующие package_data, будут добавлены в файл MANIFEST, если не предоставляется шаблон.

Ответ 2

У меня была такая же проблема и исправлена ​​ее удаление:

include_package_data=True