我有一个典型的项目结构如下所示:
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
我得到生成的鸡蛋文件和两个RPM文件(noarch.rpm和的src.rpm)。
在我的目的地机器时,我跑easy_install <generated egg file>
我eg.info文件被复制,但源文件没有复制到/usr/lib/python2.6/site-packages。 我期待我将有一个名为引擎目录。
任何人都可以指出我在做什么错? 提前致谢。
尽量让事情尽可能的简单。
快速检查与sdist
尝试这个:
$ python setup.py sdist
它应为你的包创建源代码分发文件。
它是zip格式,所以拆开包装并检查,如果有存在内所有预期的文件。
如果没有,你必须要找到原因,为什么预期的文件丢失在您的分布。
检查的事情一步一步(和简化)
你使用.py
扩展?
可能是愚蠢的问题,但在你的文件列表,我看不到里面的任何文件PY src
树。
如果您有不存在的文件刚刚.py
扩展, find_packages
不会找到任何东西。
你在哪里有你的__init__.py
位于文件?
让我们知道,这里的文件是:
$ cd src
$ find . -name "*.py"
如果你错过了__init__.py
, find_packages
不会发现整个包。
删除utils
包
你为什么拥有它吗?
最好有它安装的源代码了您开发或将其子目录在你的项目的根。
这将使得prune src/utils
你不必要MANIFEST.in
。
投入MANIFEST.in唯一要做就要做到有
如果你阅读文档MANIFEST.in
,它指出,会自动包含哪些文件(毕竟,有什么在参数中提到setup
功能,你的情况,所以通过返回的所有Python源文件find_packages
)。
出于这个原因,你要删除recursive-include src/shop/Engine
,它应受已经包含setup
呼叫。
删除prune
线。
-
src/utils
,不得在你的源代码树-它只是搞乱的东西了。 -
tools
是不被包括在内,所以没有必要进行修剪它。 -
src/ship/tests
可以在那里,它不会伤害,如果你把这些文件放在destribution。
断言,发现哪些软件包
请确保您的设置得到应有的名字packages
。
对于这个purpuse,您可以拨打find_package
更快,断言它containts,你所期望的。
(暂时地)除去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
将失败的断言。 这是标志,预计一些文件丢失。 检查。
你让你的项目居住在简单的方式后,可能周围添加更多的细节(并一步一步可以肯定,你不碰坏)。