我的包依赖于最新版本的 jsonpickle 包。旧版本可以通过 pip 安装,但是我需要最新版本(即在 Github 上)才能工作。在这种情况下,在我的代码中捆绑最新版本的 jsonpickle 通常认为可以吗?还有其他解决方案吗?我宁愿不要求我的用户不要从 github 克隆。
我正在考虑像这样组织我的包裹:
My package
|
__init__.py
file1.py
file2.py
\
jsonpickle (latest)
我的包依赖于最新版本的 jsonpickle 包。旧版本可以通过 pip 安装,但是我需要最新版本(即在 Github 上)才能工作。在这种情况下,在我的代码中捆绑最新版本的 jsonpickle 通常认为可以吗?还有其他解决方案吗?我宁愿不要求我的用户不要从 github 克隆。
我正在考虑像这样组织我的包裹:
My package
|
__init__.py
file1.py
file2.py
\
jsonpickle (latest)
正如 kag 所说,这通常不是一个好主意。并不是因为它对其他软件包不友好而被“皱眉”,而是它给您和您的用户带来了维护负担。(想象一下,有一个已修复的错误jsonpickle
会影响您的用户,但您还没有找到修复程序。如果您正常做事,他们所要做的就是 upgrade jsonpickle
,但如果您使用的是内部副本,他们必须下载jsonpickle
源代码和您的源代码,破解您的软件包,然后手动安装。)
有时,它仍然值得做。例如,非常流行的requests
模块包括它自己的其他包的副本,例如urllib3
. 是的,它确实面临上述两种成本。但这也意味着每个版本都request
可以依赖于urllib3
. 由于requests
大量使用了urllib3
很少使用的接口,甚至有一些已知错误的解决方法,这可能很有价值。
在您的情况下,这听起来不是问题。jsonpickle
在上游维护者将新版本上传到 PyPI 之前,您只需要一个临时的前沿版本。问题不在于您不希望您的用户都拥有不同的版本;这是您不想强迫他们克隆存储库并弄清楚如何手动安装它。幸运的是pip
,通过将大部分困难集中在一行中,为您解决了这个问题:
pip install git+https://github.com/foo/bar
这不是一个漂亮的解决方案,但这只是暂时的,对吧?
将一些依赖项与您的项目捆绑在一起通常不是最好的主意。有些项目无论如何都会这样做,或者如果没有可用的系统包,则将其捆绑为替代方案。(这主要出现在 C 项目中,而不是 Python 中。)
您没有提到“最新”的确切含义。这是pypi的最新版本吗?
确保安装包的特定版本或高于基准版本的最佳方法是在 setup.py 要求部分中正确指定要求。在此处阅读有关需求的更多信息 [1]。这样 pip 可以解决依赖关系,如果它在 pypi 中可用,它将是自动的。
[1] http://docs.python.org/2/distutils/setupscript.html#relationships-between-distributions-and-packages