【发布时间】:2014-11-01 18:58:46
【问题描述】:
我想创建一个仅包含我的 Subversion 版本文件的源代码分发包,然后安装这些相同的文件。
如果我在 setup.py 中使用setuptools.setup() 调用,它不包含packages 或include_package_data 的设置并运行python setup.py sdist build,我会得到一个只包含我的包版本化文件,这正是我所需要的。但是,当我尝试安装此软件包时,只会创建空目录。没有安装任何文件。
如果我包含packages = setuptools.find_packages() 并运行python setup.py sdist build,我会得到一个包,其中包含我的源代码树中的所有文件,而不仅仅是版本化文件。当我安装这个包时,包中的所有文件都已安装。
我在setup() 中使用的唯一其他参数是元数据(名称、版本等)。
如何在我的目录树中创建一个仅包含版本控制文件的包,然后安装这些相同的文件?
背景
我已验证创建的未设置 packages 和 include_package_data 的包包含正确的文件(仅包含版本化文件)。
我认为基本问题是选择要包含在包中的文件的逻辑与确定从包中安装哪些文件的逻辑脱节。因此,这两组文件(包含和安装)可能完全不同,安装集甚至不一定是包含集的子集。也就是说,很可能创建包含不会被安装的文件的包,并创建将尝试安装甚至不在包中的文件的包。
包含集逻辑在构建时运行,安装集逻辑在安装时运行。确定哪些文件在集合中的因素包括MANIFEST、MANIFEST.in、packages、py_modules、data_files、include_package_data、源文件夹树中的文件、包中的文件和版本控制元数据并且,显然,尝试操纵安装集可能会也可能不会修改包含集。
所以,如果我没有指定 MANIFEST、MANIFEST.in、packages、py_modules、data_files 和 include_package_data 中的任何一个,setuptools 会创建一个完全基于查找版本化文件的包含集在源文件夹树中。但这会使安装集为空。然后,如果我包含 packages 参数,setuptools 会通过将未版本控制的文件添加到包含集并在安装集中使用所有这些来中断版本控制文件选择。
换句话说,我试图让安装集与包含集完全匹配,而不会导致 setuptools 将未版本化的文件添加到包含集。
【问题讨论】:
-
“但是,当我尝试安装这个包时,只创建了空目录。没有安装任何文件。”创建的 tarball 文件里面有什么?我从来没有遇到过这样的问题。但是,您可以使用 MANIFEST.in packaging.python.org/en/latest/… 来控制包含哪些文件以及哪些文件不包含在内
-
另外,根据 setuptools 版本,它可能无法理解 SVN、Git 或其他版本控制系统。如果您想让 setuptools 了解版本化文件,您可能需要安装其他软件包。 Subversion 版本的兼容性也可能会影响。请在此处查看注释opensourcehacker.com/2012/08/14/…
-
我认为要缩小这个问题的范围,可以开始检查创建的包并找到线索,如果它在创建时损坏或在安装时损坏。在这里阅读 *.egg-info 文件应该会有所帮助。
-
能否展示 setup.py 文件 - 我对 setup.py 不太熟悉,所以我需要更多信息。
标签: python setuptools