我现在正在python中做一些项目,我正在试图弄清楚如何使用我自己的现有开源软件包版本。
例如,我正在使用tipcy和zc.buildout,我已经添加了'paypal'包。不幸的是它没有我需要的功能,所以我在github上分叉并添加了该功能。我将向原始软件包维护者发送一个pull请求,但是他们是否接受我的添加,我想使用我的软件包版本并保持zc.buildout管理我的依赖项的便利性。我该怎么做呢?
我是否将我自己的库上传到PyPI并用我的名字加上前缀?这不会不必要地污染指数吗?
或者我应该制作和维护自己的索引和包装回购?我在哪里可以找到这种格式?是否违反OSS许可条款以使用相同名称的修改包托管我自己的仓库? (我宁愿不用新的命名空间修改项目中的每个文件)
我确定这个问题出现了很多,而不仅仅是python。我也可以通过Maven和SBT看到这种情况......当人们想要使用他们自己版本的流行软件包时,人们通常会做些什么?
答案 0 :(得分:5)
有两种方法可以解决这个问题。我使用两者,具体取决于buildout用于的上下文:
使用mr.developer包含版本控制系统中的软件包(mr.developer支持各种系统,包括git)。我在开发时使用它。
构建私有包存储库。 Apache中的简单目录列表就足够了。将URL作为find-links
条目添加到您的私有存储库:
[buildout]
...
find-links =
...
http://username:password@dist.example.com/projectname
在此示例中,我还包括用户名和密码(buildout然后将进行身份验证)以及服务器上特定于项目的路径。当然,您也可以为所有项目构建一个大型私有存储库。
在该存储库中,您可以放入完整的鸡蛋,也可以只放入包装的tarball。在PyPI之前搜索find-links
中命名的存储库。
我将此方法用于部署扩展。这样,软件将使用已发布的软件包,这使得发布管理更加清晰和简单。
托管自己的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重量轻,易于设置。