排除在sdist的任何(子)目录中通过名称指定的目录

问题描述 投票:0回答:2

我想删除所有具有给定名称的文件夹,例如从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

这是故意的吗?有毛病吗我有什么遗漏吗?

python pypi python-packaging
2个回答
1
投票

您应该认为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的任何目录。


0
投票

根据当前讨论,我得出结论:使用distutils很难做到这一点。

因此,为了通过distutils MANIFEST.in从任何子目录中排除文件夹,应列出每个可能的文件夹级别:

__init__.py

使用setuptools时要容易得多:添加prune .git prune */.git prune */*/.git prune */*/*/.git 将从包括根目录在内的任何子目录中删除该文件夹

但是请注意,如果没有找到这样的文件夹,则会显示警告(对于这两种解决方案,因此对于distutils,实际上将有许多警告)

因此最好仅添加应添加的文件夹并删除已知的文件夹,从而完全避免这种情况。文件夹可能存在于某处的情况很少。

© www.soinside.com 2019 - 2024. All rights reserved.