easy_install / pip或apt-get

正如Rails上的Ubuntu wiki页面所述,建议gems管理你的Rails / Ruby依赖项。

使用像Django这样的Python软件包的最佳做法是什么? 我应该通过apt-get安装它们还是应该让easy_install / pip从PyPi中获取它们?

有几个论点:

  1. 使用存储库/ PPA,因为它们将使您既稳定又更新安全修复程序。

    这基本上是正确的。 例如,如果您按原样安装python-django ,则会获得安全更新。 这很好,因为你只需要保持在apt之上,但在推送更新之前你仍然需要测试一些东西(尽管每次测试都应该没问题)。

    您可能会争辩说,如果您使用了pip ,则可能永远不会检查更新。

  2. 使用pip这样你就可以使用正确的“稳定”版本。

    毫无疑问:回购落后于现实世界。 Django是2.0但是UTSntu的LTS版本的回购(许多人坚持使用服务器)你只使用Python 2在Ubuntu 16.4 lts上获得1.8,但仍然获得安全更新。

    pip为您提供最新信息。 你只需要自己更新它们。

  3. 升级repo使用的Python安装可能是一场噩梦

    当您将Ubuntu升级到下一个版本时,它会升级很多软件包。 很多事情都在改变。 我知道在Django中这意味着你必须小心注意代码不兼容,弃用……但这同样适用于所有其他Python代码。

    pip也是如此,但是你可以一次做一件事。 您知道导致问题的原因,以便您知道在哪里找到修复程序。

  4. pip + virtualenv让你把事情分开

    virtualenv让您拥有可移植的小型Python环境。 这允许您在同一台计算机上将几个不同的Python环境并排运行。

    显而易见的好处似乎是维护,因为您可以像管理代码一样管理环境。 甚至将环境存储在VCS中…… 但是你应该记住,拥有12个不同的virtualenv s意味着需要检查和更新的12个环境。


编辑:在服务器上进行了一系列可怕的升级以使其从Lucid到Precise之后,我已经从混合的Apt + pip(nr 1和2)切换到纯粹的pip + virtualenv(nr.4)情况。 我没有每个站点有一个virtualenv,而是在十几个站点之间有一个共享站点。 这个目前正在运作。

我还必须编写一个小脚本来检查使用pip安装的软件包的状态。 如果有更新,我必须手动应用它们(这很好,因为我在本地测试它们,在本地virtualenv)。 这一切仍然比原来更痛苦,但从长远来看好得多。

  • 来自存储库的包

    只要您的应用程序以某种特定于Ubuntu的方式安装,就应该安装它们。 它们保证您可以在Ubuntu机器上安装稳定版本,它们受到支持,有时比通过pip获得的版本更成熟。 如果您部署了一堆ubuntu服务器,或者您正在编写Ubuntu应用程序,请使用这些服务器(如果可用)

    它们有时也包含特定于Ubuntu的修改。

  • pip vs easy_install

    正如Django黑客James Bennett所说的那样,对此并不多说:

    请为Guido的爱,停止使用setuptools和easy_install,并使用distutils和pip代替。

    有关这些差异的深入讨论,请参阅James Bennett(django)的封装和Ian Bicking(Mozilla)的“On Packaging”的几个更正 。

如果您想要安全,请使用virtualenv尝试您的pip部署。 这为您提供了一个独立的python环境,因此您可以确保您的应用程序可以在任何计算机上运行。

稍等一下,我相信有些人会不同意我的观点。