从setuptool内置rpm分配不包括源文件(Excluding source files fro

2019-10-20 13:32发布

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

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我得到生成的鸡蛋文件和两个RPM文件(noarch.rpm和的src.rpm)。

在我的目的地机器时,我跑easy_install <generated egg file>我eg.info文件被复制,但源文件没有复制到/usr/lib/python2.6/site-packages。 我期待我将有一个名为引擎目录。

任何人都可以指出我在做什么错? 提前致谢。

Answer 1:

尽量让事情尽可能的简单。

快速检查与sdist

尝试这个:

$ python setup.py sdist

它应为你的包创建源代码分发文件。

它是zip格式,所以拆开包装并检查,如果有存在内所有预期的文件。

如果没有,你必须要找到原因,为什么预期的文件丢失在您的分布。

检查的事情一步一步(和简化)

你使用.py扩展?

可能是愚蠢的问题,但在你的文件列表,我看不到里面的任何文件PY src树。

如果您有不存在的文件刚刚.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可以在那里,它不会伤害,如果你把这些文件放在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

将失败的断言。 这是标志,预计一些文件丢失。 检查。

你让你的项目居住在简单的方式后,可能周围添加更多的细节(并一步一步可以肯定,你不碰坏)。



文章来源: Excluding source files from built rpm distribution with setuptool