setuptools将依赖项合并到自己的包中

时间:2015-09-07 12:32:36

标签: python setuptools

我有两个setuptools包(通过setup.py管理,导入并调用setuptools.setup())。两者共享相同的基本命名空间包:foo.bar.utilfoo.bar.service。第二个取决于第一个,并列在install_requires中。该程序包由MANIFEST.in项下的所有src/个项目组成,这些项目仅移植src/,然后以递归方式排除*.pyc__pycache__/**。对于两个包,namespace_packages都设置为['foo', 'foo.bar']

它按预期工作。我可以构建一个sdist,将其推送到私有PyPI,pip install,等等。但是,当第二个包需要第一个时,我运行任何python setup.py命令(testdevelopinstall等),它完全是炸弹。

奇怪的是,当我在develop失败后启动CPython解释器时,第一个包就在那里。但是,第一个程序包所依赖的任何程序包(如more-itertools)都会导致尝试将这些程序包加载到错误状态。不知何故,代码正在被合并,但依赖关系不是。

最后,如果我打开DISTUTILS_DEBUG=1SETUPTOOLS_DEBUG=1,我会看到来自私有PyPI的提取。我看到尝试打包bdist_egg。这就是奇怪的地方:在bdist_egg输出行之后,不再提及这个包了吗?

我一直在捣乱我的大脑并不断寻找。有没有人碰到这样的事情?

编辑:

所以,我在src/下打包我的内容,如下所示: http://blog.ionelmc.ro/2014/05/25/python-packaging/

查看python setup.py develop DISTUTILS_DEBUG=1输出,我发现graft src中的MANIFEST.in指令包括src/<required code>src/<this egg-info>和{ {1}}。呵呵。奇怪的。然后它再次抓住所有内容src/<required egg-info>!发生了什么事?

编辑:

好的,这是我试图为Python生态系统过于聪明。我为我的公司创建了一个鸡蛋模板。我们的目标之一是拥有一个可刷新的模板src/src/属于那个 - 如果我们想要注入自定义目标,我们可以运行模板更新程序 Bash脚本,它将克隆我们所有的GitHub存储库,进行修改,并可选择提交和推他们。这包括Tox和Travis。

所以我做的是从setup.py导入setup_cfg.py。前者具有包名称和版本,并且被Updater忽略。第二个是样板。

问题在于setup.py,所有python setup.py <develop|install>最终都在同一地点(我假设)。因此,安装依赖包的行为实际上安装了包的问题。当安装包有问题的时候,它被跳过了。

向后翻转,我们有setup_cfg.py这是样板文件,setup_template.py实际上没有setup.py代码,只有项目名称和版本,完美无缺!

不幸的是,Python没有env-internal软件包版本管理或清洁。 :(

现在,我仍然面临的唯一问题是,由于某种原因,这不适用于Tox。我怀疑命名空间包有些奇怪。我将去看看Zope是如何测试的,因为我知道他们使用命名空间包。

0 个答案:

没有答案