2015-03-13 2 views
12

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

Мой 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 включены.

Или this blog post по-прежнему верно? 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?

ответ

23

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

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

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

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

foo/ 
     __init__.py 
     bar.txt 
setup.py 

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

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 Installing package data документации «унаследованных» Distutils; с комментарием для 2.7, 3.1:

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

+1

Спасибо за подробный ответ. К сожалению, я просто выполнил эти инструкции дословно, а 'bar.txt' не появился в' foo-2015.3.tar.gz'. Вы упоминаете намеренно использование старой версии setuptools, но вы не скажете почему. Может ли это объяснить, почему он не работает? –

5

Я была такая же проблема и фик его следует удаление:

include_package_data=True