在我的python项目中使用自定义包

时间:2010-11-01 04:06:14

标签: python buildout pypi tipfy

我现在正在python中做一些项目,我正在试图弄清楚如何使用我自己的现有开源软件包版本。

例如,我正在使用tipcy和zc.buildout,我已经添加了'paypal'包。不幸的是它没有我需要的功能,所以我在github上分叉并添加了该功能。我将向原始软件包维护者发送一个pull请求,但是他们是否接受我的添加,我想使用我的软件包版本并保持zc.buildout管理我的依赖项的便利性。我该怎么做呢?

我是否将我自己的库上传到PyPI并用我的名字加上前缀?这不会不必要地污染指数吗?

或者我应该制作和维护自己的索引和包装回购?我在哪里可以找到这种格式?是否违反OSS许可条款以使用相同名称的修改包托管我自己的仓库? (我宁愿不用新的命名空间修改项目中的每个文件)

我确定这个问题出现了很多,而不仅仅是python。我也可以通过Maven和SBT看到这种情况......当人们想要使用他们自己版本的流行软件包时,人们通常会做些什么?

6 个答案:

答案 0 :(得分:5)

有两种方法可以解决这个问题。我使用两者,具体取决于buildout用于的上下文:

  1. 使用mr.developer包含版本控制系统中的软件包(mr.developer支持各种系统,包括git)。我在开发时使用它。

  2. 构建私有包存储库。 Apache中的简单目录列表就足够了。将URL作为find-links条目添加到您的私有存储库:

    [buildout]
    ...
    find-links =
        ...
        http://username:password@dist.example.com/projectname
    

    在此示例中,我还包括用户名和密码(buildout然后将进行身份验证)以及服务器上特定于项目的路径。当然,您也可以为所有项目构建一个大型私有存储库。

    在该存储库中,您可以放入完整的鸡蛋,也可以只放入包装的tarball。在PyPI之前搜索find-links中命名的存储库。

    我将此方法用于部署扩展。这样,软件将使用已发布的软件包,这使得发布管理更加清晰和简单。

  3. 托管自己的OSS软件包非常好!这是使用OSS时获得的自由之一。请注意,当您像这样分叉GPL代码并将其分发给第三方时,您需要对它们进行更改。包存储库是遵守此目的的一种方式。

答案 1 :(得分:2)

为了控制您的头痛,我建议您将所有此类自定义代码与您的软件包捆绑在一起。假设你做了一些package的分叉。只要它的许可证允许它,我就会将package的修改版本与我的代码捆绑在一起,好像它只是另一个目录。您可以将其置于package下的本地,以便轻松找到它。一旦package的开发人员修复了您需要的内容,只需删除此目录并使其再次依赖于在线包。

此方法的另一个好处是可以更轻松地向用户/客户分发。

答案 2 :(得分:1)

我使用buildout已经有一段时间了,但是如果我没记错的话,有一个pip配方允许你使用pip需求文件。您可以创建包含以下内容的需求文件:

-e git+http://<github url>

这将在安装时在本地检查包。

答案 3 :(得分:0)

首先会搜索您在项目的setup.py中放入dependency_links的所有路径。因此,只需将您的包放入路径并将dependency_links设置为该路径。

local_packages = ['file:///path/to/packages']

setup(
 ...
 dependency_links=local_packages,
...)

Setuptool文档更多地介绍了它是如何工作的,但这就是它的全部内容。

编辑: zc.buildout默认使用setuptools dependency_links var。 If you want to turn it off

答案 4 :(得分:0)

  

我是否将我自己的库上传到PyPI并用我的名字加上前缀?

没有

  

这不会不必要地污染指数吗?

显然。 (另外,你假设你的扩展实际上对其他人有用。除了你之外,对你这些人来说可能没什么用。实际上,你的扩展可能表示无法理解包。)

  

或者我应该制作和维护自己的索引和包装回购?

从不。那太傻了。你有修改过的包。除非您要完成针对PyPI的操作,否则您不需要存储库。你可以尝试,但为什么要这么麻烦?


这是你做的。

<强>延伸

您可以轻松扩展给定的包而无需修改或分叉。

<强> my_paypal.py

from paypal import *

class MyFancyExtension( SomeExistingClass ):
    def override( self, ... )

def my_other_extension( ... ):
    this()
    that()

这很容易。它通常比分叉更好,因为你保留原始包装不受扩展的影响。

答案 5 :(得分:0)

为您的专有,私有,分叉或开发包提供自己的自定义PyPI服务器是完全合理的。

例如pypiserver重量轻,易于设置。