我有一个典型的项目结构,如下所示:
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的目录。
有人能指出我做错了什么吗?提前谢谢。
答案 0 :(得分:1)
尽量保持简单。
sdist
试试这个:
$ python setup.py sdist
它将为您的包创建源分发文件。
它采用zip格式,因此如果当前存在所有预期的文件,请将其解压缩并检查。
如果没有,您必须找到原因,为什么您的发行版中缺少预期的文件。
.py
分机吗?可能是个愚蠢的问题,但是在你的文件列表中我没有在src
树中看到任何py文件。
如果你只有那些没有.py
扩展名的文件,find_packages
将找不到任何内容。
__init__.py
文件位于何处?请告诉我们,文件在哪里:
$ cd src
$ find . -name "*.py"
如果您错过__init__.py
,find_packages
将找不到整个包裹。
utils
包为什么你在那里?
最好从您开发的源代码中安装它,或者在项目中移动它的子目录 根
这会在您的prune src/utils
中无需提交MANIFEST.in
。
如果您阅读MANIFEST.in
的文档,它会说明自动包含哪些文件(全部,什么
在setup
函数的参数中提到,所以在你的情况下返回的所有python源文件
find_packages
)。
出于这个原因,你应该删除recursive-include src/shop/Engine
,因为它已经存在
包含在setup
电话中。
删除prune
行。
src/utils
不应该在你的源代码树中 - 它只是搞乱了。tools
不包括在内,因此无需修剪它。src/ship/tests
可以存在,如果您将这些文件保存在分发中,也不会有害。确保您的设置获得packages
的正确名称。
对于这种情况,你可以尽快打电话给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
会因断言而失败。这是标志,一些预期的文件丢失了。检查一下。
在您以简单的方式生活项目之后,您可以添加更多详细信息(并执行此步骤 一步一步确定,你不会破坏某些东西)。