Setuptools troubles - исключая пакеты, включая файлы данных
Я новичок в setuptools. Я видел несколько подобных вопросов, и он немного сходит с ума, что я, кажется, следовал советам, которые я видел, но setuptools все еще делает что-то отличное от того, что я хочу.
Вот структура моего проекта:
.
..
package1/
__init__.py
abc.py
...
tests/
__init__.py
test_package1.py
LICENSE
README.md
RELEASE
setup.py
И вот содержимое моего setup.py:
#!/usr/bin/env python
import os
#from distutils.core import setup
from setuptools import setup, find_packages
setup(
name='package1',
version='1.1',
test_suite="tests",
packages=find_packages(exclude=['tests']),
include_package_data=True,
package_data = {
'': ['LICENSE', 'README.md5', 'RELEASE']
},
)
Кроме того, в моем файле манифеста я:
include LICENSE
include RELEASE
include README.md
Я создаю tar с помощью:
python setup.py sdist
Я хочу:
- Исключить каталог
tests
из исходного дистрибутива;
- У вас есть файлы LICENSE, README.md, RELEASE в каталоге сайтов-пакетов, либо на верхнем уровне, либо внутри каталога package1 (на этом я соглашусь либо).
Вместо этого вот что происходит:
-
tests
каталог остается в созданном tar-архиве и устанавливается на сайт-пакеты;
- Файлы копируются в архив, но не устанавливаются в каталог пакета пакета.
У меня нет идей, может кто-нибудь объяснить мне, что я делаю неправильно и как это исправить?
Ответы
Ответ 1
Вы должны создать новый файл с именем MANIFEST.in
в корневом уровне вашего пакета, а затем выполните следующие инструкции:
-
Чтобы контролировать, какие файлы попадают в файл tar, создайте новый файл с именем MANIFEST.in
на корневом уровне вашего пакета. Например, вы можете исключить целые каталоги из своего дистрибутива, используя recursive-exclude
в файле MANIFEST.in
. В вашем случае вам понадобится файл MANIFEST.in
, содержащий:
recursive-exclude tests *
-
Не так часто включать README и другие файлы в каталог сайтов, но если вы действительно этого хотите, затем зайдите внутрь package1
и создайте символические ссылки на файлы, которые вы хотите включить:
cd package1
ln -s ../LICENSE
ln -s ../README.md
ln -s ../RELEASE
Затем измените следующую строку в файле setup.py:
package_data = {
'': ['LICENSE', 'README.md', 'RELEASE']
в
package_data = {
'package1': ['LICENSE', 'README.md', 'RELEASE']
Ответ 2
find_packages
использует fnmatchcase
для фильтрации исключений. Вы можете проверить, соответствует ли ваш шаблон исключения имени пакета:
>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False
Предполагая, что все тесты в вашем проекте живут в именах пакетов, заканчивающихся на tests
или подпакетах этих пакетов, должно быть достаточно, чтобы исключить весь тестовый код:
setup(
name='package1',
version='1.1',
packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),
)
Ответ 3
если ваша структура верна:
- папка тестов не является пакетом (у него нет файла init.py), поэтому find_package не исключает его.
- include_package_data = True означает, что все файлы с версиями будут включены, если явно не исключены.
так: попробуйте исключить тесты /* в вашем MANIFEST.in
Надеюсь, что это помогло
Ответ 4
MANIFEST.in позаботится об этом.
prune tests/
include LICENSE README.md RELEASE
если у вас есть статические файлы для добавления, добавьте их
...
recursive-include package1/static *
Ответ 5
Я пытался все, и ничего, казалось, не работало, пока я не удалил каталог build
(увидев другой ответ, упоминающий *.egg-info/
), и он наконец *.egg-info/
. python setup.py clean --all
также должен выполнить эту работу.