Исключить каталог, указанный по имени, в любом (под) каталоге в sdist - PullRequest
1 голос
/ 06 апреля 2020

Я хочу удалить все папки с заданным именем, скажем, .git из python sdist.

Имя папки не имеет значения, вопрос должен быть общим. Я использую .git здесь, потому что это был мой случай использования: подпапка может иметь папку .git, но prune (которая автоматически удаляет папки с именем .git [среди других]) должна была быть отключена (setup.cfg: [sdist] prune=1).

Из https://packaging.python.org/guides/using-manifest-in/ есть prune .git, который удаляет папку .git toplevel .

Но как можно Удалить папку с таким именем? distutils всегда привязывает выражение соответствия к началу или началу пути к файлу, и ** не поддерживается для сопоставления с любым символом, включая косую черту.

То, что я пробовал с Исключение. git каталог в pypi : global-exclude .git, но он также не работает, так как он соответствует файлам, а не папкам.

Единственный обходной путь, который я вижу, это использовать:

prune .git
prune */.git
prune */*/.git
prune */*/*/.git

Это намеренным? Жук? Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы должны думать, что MANIFEST.in является аддитивным, а не вычитающим. У него есть некоторые значения по умолчанию , перечисленные здесь , и все остальное, кроме того, что вы явно указали, игнорируется.

(Использование tests в качестве примера в вашем комментарии не идеально, поскольку все файлы, соответствующие test/test*.py включены по умолчанию.)

Учитывая следующий пример:

$ tree .
.
├── bar
│   └── __init__.py
├── foo
├── my_package
│   ├── __init__.py
│   ├── bar
│   │   └── __init__.py
│   └── foo
└── setup.py

$ cat setup.py
from setuptools import setup, find_packages

setup(
    name="my-package",
    version='1.0.0',
    packages=find_packages(),
)

Запуск python setup.py sdist приведет к включению следующего, поскольку все они являются модулями:

bar/
bar/__init__.py
my_package/
my_package/__init__.py
my_package/bar/
my_package/bar/__init__.py
setup.py

И исключение следующего, потому что они не являются модулями:

foo/
my_package/foo/ 

Аналогично, все каталоги .git или действительно любой каталог без __init__.py будут исключены по умолчанию.

0 голосов
/ 07 апреля 2020

Из текущего обсуждения я делаю вывод: с distutils это сделать нелегко.

Поэтому, чтобы исключить папку из любого подкаталога через distutils, в файле MANIFEST.in должен быть указан каждый возможный уровень папки:

prune .git
prune */.git
prune */*/.git
prune */*/*/.git

При использовании setuptools это намного проще: добавление prune **/.git удаляет папку из любого подкаталога, включая каталог root

Обратите внимание, что предупреждение будет напечатано, если такая папка не найдена ( для обоих решений, так что для distutils на самом деле будет много предупреждений)

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

...