我是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
目录; 相反,这是发生的事情:
tests
目录仍然在创建的tar存档中并安装到site-packages; 我没有想法,有人可以向我解释我做错了什么以及如何解决它?
答案 0 :(得分:21)
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.*']),
)
要从源发行版中排除tests
文件夹,请将以下内容添加到MANIFEST.in中:
recursive-exclude tests *
答案 1 :(得分:17)
您应该在程序包的根级别创建一个名为MANIFEST.in
的新文件,然后按照以下说明操作:
要控制哪些文件最终出现在tar文件中,请在程序包的根级别创建一个名为MANIFEST.in
的新文件。例如,您可以使用recursive-exclude
文件中的MANIFEST.in
从发布中排除整个目录。在您的情况下,您需要MANIFEST.in
文件包含:
recursive-exclude tests *
在site-packages目录中包含README和其他文件并不常见,但如果您真的想要,请进入package1
并创建要包含的文件的符号链接:< / p>
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 :(得分:0)
如果你的结构是真的:
所以:在你的MANIFEST.in
中尝试排除测试/ *我希望它有所帮助
答案 3 :(得分:0)
MANIFEST.in会照顾它。
prune tests/
include LICENSE README.md RELEASE
如果要添加静态文件,请使用
添加它们...
recursive-include package1/static *
答案 4 :(得分:0)
我一直在尝试一切,但似乎没有任何效果,直到我删除了build
目录(看到another answer mentioning *.egg-info/
directory之后),它终于可以工作了。 python setup.py clean --all
也应该做。