5

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

例如,我将tipfy 与zc.buildout 一起使用,并且已添加到“paypal”包中。不幸的是,它没有我需要的功能,所以我在 github 上分叉了它并添加了该功能。我将向原始包维护者发送拉取请求,但无论他们是否接受我的添加,我都想使用我的包版本并保持让 zc.buildout 管理我的依赖项的便利。我该怎么做呢?

我是否将自己对库的看法上传到 PyPI 并在其前面加上我的名字?这不会不必要地污染索引吗?

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

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

4

6 回答 6

5

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

  1. 使用mr.developer包含来自版本控制系统的包(mr.developer 支持广泛的系统,包括 git)。我在开发时使用它。

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

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

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

    在该存储库中,您要么放置完整的鸡蛋,要么只放置软件包的 tarball。find-links在 PyPI 之前搜索命名为 in 的存储库。

    我使用这种方法进行部署构建。这样软件将使用已发布的包,这使得发布管理更加清晰和简单。

托管您自己的 OSS 包分支非常好!这是您在使用 OSS 时获得的自由之一。请注意,当您像这样分叉 GPL 代码并将其分发给第三方时,您需要让他们可以使用您的更改。包存储库是遵守这一点的一种方式。

于 2010-11-01T09:53:51.287 回答
2

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

这种方法的另一个好处是更容易分发给用户/客户。

于 2010-11-01T05:00:03.203 回答
1

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

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

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

于 2010-11-01T10:00:07.167 回答
0

dependency_links将首先搜索您在项目的 setup.py 中输入的任何路径。因此,只需将您的包放在一个路径中并设置dependency_links为该路径。

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

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

Setuptool文档详细介绍了它的工作原理,但这就是它的全部内容。

编辑: zc.buildout 默认使用 setuptools dependency_links var。如果你想关掉它

于 2010-11-01T04:59:31.647 回答
0

我是否将自己对库的看法上传到 PyPI 并在其前面加上我的名字?

不。

这不会不必要地污染索引吗?

明显地。(此外,您假设您的扩展实际上对其他人有用。它可能对除您以外的任何人都没有那么有用。实际上,您的扩展可能表明无法理解该包。)

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

绝不。这完全是愚蠢的。你有修改后的包。除非您要针对 PyPI 完成,否则您不需要存储库。你可以试试,但何苦呢?


这就是你要做的。

延长

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

my_paypal.py

from paypal import *

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

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

这很容易。它通常比分叉更好,因为您保留了扩展未触及的原始包。

于 2010-11-01T10:23:47.700 回答
0

为您的专有、私有、分叉或开发包拥有自己的自定义 PyPI 服务器是非常有意义的。

例如pypiserver是轻量级且易于设置的。

于 2017-09-30T12:04:32.047 回答