我想删除所有具有给定名称的文件夹,例如从python sdist中删除.git
。
文件夹的名称无关紧要,这个问题是笼统的。我在这里使用.git
是因为这是我的用例:子文件夹可以具有.git
文件夹,但是必须禁用prune
(它会自动删除.git
等文件夹)setup.cfg:[ C0])。
从[sdist] prune=1
中有https://packaging.python.org/guides/using-manifest-in/,它确实删除了prune .git
顶层文件夹。
但是如何删除具有该名称的任何文件夹? .git
总是将匹配表达式锚定到文件路径的开头或开头,并且不支持distutils
来匹配包括斜杠在内的任何字符。
我在**
中尝试过的操作:Leaving out the .git directory on pypi,但由于它匹配文件而不是文件夹,因此也不起作用。
我看到的唯一解决方法是使用:
global-exclude .git
这是故意的吗?有毛病吗我有什么遗漏吗?
您应该认为prune .git
prune */.git
prune */*/.git
prune */*/*/.git
是加法的,而不是减法的。它具有一些默认值MANIFEST.in
,除您明确指定的内容外,其他任何内容都将被忽略。
(在注释中使用listed here作为示例不是很理想,因为默认情况下包含所有与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
的任何目录。
根据当前讨论,我得出结论:使用distutils很难做到这一点。
因此,为了通过distutils MANIFEST.in从任何子目录中排除文件夹,应列出每个可能的文件夹级别:
__init__.py
使用setuptools时要容易得多:添加prune .git
prune */.git
prune */*/.git
prune */*/*/.git
将从包括根目录在内的任何子目录中删除该文件夹
但是请注意,如果没有找到这样的文件夹,则会显示警告(对于这两种解决方案,因此对于distutils,实际上将有许多警告)
因此最好仅添加应添加的文件夹并删除已知的文件夹,从而完全避免这种情况。文件夹可能存在于某处的情况很少。