使用setuptool从构建的rpm分发中排除源文件

时间:2014-07-24 02:47:21

标签: python rpm setuptools egg

我有一个典型的项目结构,如下所示:

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_eggpython setup.py bdist_rpm时,我得到了egg文件并生成了两个rpm文件(noarch.rpm和src.rpm)。

在我的目标计算机上运行easy_install <generated egg file>时,我的eg.info文件被复制,但源文件不会被复制到/usr/lib/python2.6/site-packages。我原以为我会有一个名为Engine的目录。

有人能指出我做错了什么吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

尽量保持简单。

使用sdist

快速检查

试试这个:

$ python setup.py sdist

它将为您的包创建源分发文件。

它采用zip格式,因此如果当前存在所有预期的文件,请将其解压缩并检查。

如果没有,您必须找到原因,为什么您的发行版中缺少预期的文件。

逐步检查(并简化)

您使用.py分机吗?

可能是个愚蠢的问题,但是在你的文件列表中我没有在src树中看到任何py文件。

如果你只有那些没有.py扩展名的文件,find_packages将找不到任何内容。

您的__init__.py文件位于何处?

请告诉我们,文件在哪里:

$ cd src
$ find . -name "*.py"

如果您错过__init__.pyfind_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可以存在,如果您将这些文件保存在分发中,也不会有害。

断言,找到了什么包

确保您的设置获得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

会因断言而失败。这是标志,一些预期的文件丢失了。检查一下。

在您以简单的方式生活项目之后,您可以添加更多详细信息(并执行此步骤 一步一步确定,你不会破坏某些东西)。