我有一个典型的项目结构,如下所示:
EngineEmulator
src
ship
engine
emulator
mapping
tests
emulator
mapping
utils
common
doc
....
tools
....
setup.py
MANIFEST.in
setup.cfg
README.rst
我的 setup.py 如下所示:
from setuptools import setup, find_packages
setup(
name='Engine',
version=1.0.0,
description='Engine Project',
package_dir={'': 'src'},
packages=find_packages(
'src',
exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
install_requires =['pycrypto',
'kombu >=1.1.3'],
author='Demo',
author_email='demo@eliza.net'
license='MIT',
classifiers=[
'Topic :: Demo Engine',
'Development Status:: 3 - Iteration',
'Programming Language :: Python -2.6'
]
)
我的 setup.cfg 如下所示:
[egg_info]
tag_build = .dev
tag_svn_revision = 1
[rotate]
#keep last 15 eggs, clean up order
match = .egg
keep = 15
我的 MANIFEST.in 如下所示:
include README.rst
recursive-include src/ship/Engine
prune src/utils
prune src/ship/tests
prune tools/
当我运行python setup.py bdist_egg
时和python setup.py bdist_rpm
我得到了 Egg 文件和生成的两个 rpm 文件(noarch.rpm 和 src.rpm)。
当我运行 easy_install <generated egg file>
时在我的目标计算机中我的eg.info 文件被复制,但源文件没有被复制到/usr/lib/python2.6/site-packages。我原以为会有一个名为 Engine 的目录。
有人可以指出我做错了什么吗?提前致谢。
最佳答案
尽量让事情变得尽可能简单。
使用sdist
快速检查
试试这个:
$ python setup.py sdist
它将为您的包创建源分发文件。
它是 zip 格式,因此请将其解压并检查里面是否存在所有预期的文件。
如果没有,您必须找到原因,即您的发行版中缺少预期文件的原因。
逐步检查(并简化)
您使用.py
扩展名吗?
可能是愚蠢的问题,但在您的文件列表中,我在 src
树中没有看到任何 py 文件。
如果您只有没有 .py
扩展名的文件,find_packages
将找不到任何内容。
您的 __init__.py
文件位于何处?
让我们知道文件在哪里:
$ cd src
$ find . -name "*.py"
如果你错过了__init__.py
,find_packages
将找不到整个包。
删除 utils
包
你为什么把它放在那里?
最好将其安装在您开发的源代码之外或将其移动到项目中的子目录中 根。
这将使您的 MANIFEST.in
中不再需要 prune src/utils
。
仅将必须存在的内容放入 MANIFEST.in
如果您阅读 MANIFEST.in
的文档,它会说明自动包含哪些文件(全部、哪些文件)
在 setup
函数的参数中提到,所以在你的情况下,所有 python 源文件返回
find_packages
)。
因此,您应删除 recursive-include src/shop/Engine
因为它已经存在
由 setup
调用包含。
删除prune
行。
src/utils
不应出现在您的源代码树中 - 它只会把事情搞砸。tools
不包含在内,因此无需修剪。src/ship/tests
可以在那里,如果您将这些文件保留在分发中,它不会造成损害。
断言,找到了哪些包
确保您的设置获得包
的正确名称。
对于这个目的,您可以更快地调用 find_package
并断言它包含您所期望的内容。
(暂时)删除setup.cfg
只是为了让事情变得更简单。
拟议的项目重组
您的文件结构应类似于以下方式:
src/ship/__init__.py
src/ship/engine/__init__.py
src/ship/engine/emulator/__init__.py
src/ship/engine/emulator/module.py
src/ship/engine/emulator/module2.py
src/ship/engine/mapping/other.py
src/ship/engine/mapping/another.py
src/ship/tests/__init__.py
src/ship/tests/emulator/__init__.py
src/ship/tests/emulator/test_module.py
src/ship/tests/emulator/test_module2.py
src/ship/tests/mapping/__init__.py
src/ship/tests/mapping/test_other.py
src/ship/tests/mapping/test_another.py
doc
doc/index.rst
tools
tools/knife.py
setup.py
MANIFEST.in
README.rst
setup.py
from setuptools import setup, find_packages
packages=find_packages("src")
assert "ship.engine" in packages
assert "ship.engine.emulator" in packages
assert "ship.engine.mapping" in packages
#etc
install_requires =['pycrypto', 'kombu>=1.1.3'] #watch the spaces around `>=`, shall not be there
setup(
name="Engine",
package_dir={'': 'src'},
packages=packages,
install_requires=install_requires
)
MANIFEST.in
include README.rst
结论
可能会发生这样的情况,即运行
$ python setup.py sdist
断言会失败。这是迹象,一些预期的文件丢失了。检查一下。
在你让你的项目以简单的方式生活之后,你可以添加更多细节(并执行以下步骤 一步一步确保您不会破坏某些东西)。
关于python - 使用 setuptool 从构建的 rpm 发行版中排除源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924296/