python - 使用 setuptool 从构建的 rpm 发行版中排除源文件

标签 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_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__.pyfind_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/

相关文章:

python - Pandas 使用日期列通过 .shift 创建天列

linux - 在不使用 make 的情况下制作 make

linux - RPM 是否需要编译阶段?

java - JBoss 的单独登录配置?

python - Python egg 的源代码在哪里?

python - 无法运行树懒注释工具

python - 使用子进程延迟执行命令

python - 如何将多处理与多线程一起使用?

python - 求解线性方程组。使用 numpy 的三个变量

python - 如何打包分发使用共享库的 python 模块?