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 *