我想创建一个源代码分发包,它自动只包含我的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将未版本控制的文件添加到包含集。
答案 0 :(得分:0)
我找到了一种让setuptools支持此功能的方法。我只是在安装软件包时提供packages
列表,并在构建软件包时将其保留为None。我还使用include_package_data = True
来获取要安装的数据文件(没有它,数据文件包含在包中但未安装)。
if 'install' in sys.argv:
packages = setuptools.find_packages()
else:
packages = None
setuptools.setup(
packages = packages,
include_package_data = True,
...
)