2

我的包依赖于最新版本的 jsonpickle 包。旧版本可以通过 pip 安装,但是我需要最新版本(即在 Github 上)才能工作。在这种情况下,在我的代码中捆绑最新版本的 jsonpickle 通常认为可以吗?还有其他解决方案吗?我宁愿不要求我的用户不要从 github 克隆。

我正在考虑像这样组织我的包裹:

My package
    |
__init__.py
 file1.py
 file2.py
          \
        jsonpickle (latest)

即做这里所做的事情:Python: importing a sub-package or sub-module

4

2 回答 2

3

正如 kag 所说,这通常不是一个好主意。并不是因为它对其他软件包不友好而被“皱眉”,而是它给您和您的用户带来了维护负担。(想象一下,有一个已修复的错误jsonpickle会影响您的用户,但您还没有找到修复程序。如果您正常做事,他们所要做的就是 upgrade jsonpickle,但如果您使用的是内部副本,他们必须下载jsonpickle源代码和您的源代码,破解您的软件包,然后手动安装。)

有时,它仍然值得做。例如,非常流行的requests模块包括它自己的其他包的副本,例如urllib3. 是的,它确实面临上述两种成本。但这也意味着每个版本都request可以依赖于urllib3. 由于requests大量使用了urllib3很少使用的接口,甚至有一些已知错误的解决方法,这可能很有价值。

在您的情况下,这听起来不是问题。jsonpickle在上游维护者将新版本上传到 PyPI 之前,您只需要一个临时的前沿版本。问题不在于您不希望您的用户都拥有不同的版本;这是您不想强迫他们克隆存储库并弄清楚如何手动安装它。幸运的是pip,通过将大部分困难集中在一行中,为您解决了这个问题:

pip install git+https://github.com/foo/bar

这不是一个漂亮的解决方案,但这只是暂时的,对吧?

于 2013-08-17T02:14:17.260 回答
2

将一些依赖项与您的项目捆绑在一起通常不是最好的主意。有些项目无论如何都会这样做,或者如果没有可用的系统包,则将其捆绑为替代方案。(这主要出现在 C 项目中,而不是 Python 中。)

您没有提到“最新”的确切含义。这是pypi的最新版本吗?

确保安装包的特定版本或高于基准版本的最佳方法是在 setup.py 要求部分中正确指定要求。在此处阅读有关需求的更多信息 [1]。这样 pip 可以解决依赖关系,如果它在 pypi 中可用,它将是自动的。

[1] http://docs.python.org/2/distutils/setupscript.html#relationships-between-distributions-and-packages

于 2013-08-16T22:14:22.333 回答