问题描述
如Ubuntu wiki page on Rails中所述,建议gems管理您的Rails /Ruby依赖项。
Django等Python软件包的最佳实践是什么?我应该通过apt-get安装它们还是应该让easy_install /pip从PyPi中获取它们?
最佳解决思路
有几个论点:
-
使用存储库/PPA,因为它们可以使您保持稳定和最新的安全修复程序。这基本上是正确的。例如,如果您按原样安装
python-django
,则会获得安全更新。这很好,因为你只需要掌握apt,但在推送更新之前你仍然需要测试一些东西(尽管每次测试都应该没问题)。您可能会争辩说,如果您使用的是pip
,则可能永远不会检查更新。 -
使用
pip
,您可以使用正确的”stable”版本。毫无疑问:回购落后于现实世界。 Django是2.0但是UTSntu的LTS版本的回购(许多人坚持使用服务器)你只使用Python 2在Ubuntu 16.4 lts上获得1.8但仍然获得安全更新。pip
始终为您提供最新信息。你只需要自己更新它们。 -
升级repo-used Python安装可能是一场噩梦当您将dist-upgrade Ubuntu升级到下一版本时,它会升级很多软件包。很多事情都在变化。我知道在Django中这意味着你必须小心注意code-incompatibilities,弃用……但这同样适用于所有其他Python代码。对于
pip
也是如此,但是使用pip
,您可以一次做一件事。您知道导致问题的原因,以便您知道在何处查找修复程序。 -
pip
+virtualenv
可让您保持独立virtualenv
让您拥有可移植的小型Python环境。这允许您在同一台计算机上将多个不同的Python环境并排运行。显而易见的好处似乎是维护,因为您可以像管理代码一样管理环境。甚至将环境存储在VCS中……但您应该记住,拥有12个不同的virtualenv
意味着需要检查和更新的12个环境。
编辑:在服务器上进行了一系列可怕的升级以将其从Lucid转移到Precise之后,我已经从混合的Apt + pip(nr 1和2)切换到纯粹的pip + virtualenv(nr.4)情况。我没有每个站点有一个virtualenv,而是在dozen-or-so站点之间有一个共享站点。这是现在的工作。
我还必须编写一个小脚本来检查使用pip安装的软件包的状态。如果有更新,我必须手动应用它们(这很好,因为我在本地测试它们,在本地virtualenv)。这一切仍然比原来更痛苦,但从长远来看要好得多。
次佳解决思路
-
来自存储库的软件包只要您的应用程序以某种特定于Ubuntu的方式安装,就应该安装这些软件包。它们保证你可以在Ubuntu机器上安装一个稳定的版本,它们受支持,有时比你通过pip得到的版本更成熟。如果您部署了一堆ubuntu服务器,或者您正在编写Ubuntu应用程序,请使用这些服务器(如果可用)。它们有时也含有Ubuntu-specific修饰。
-
pip vs easy_install对于那些人说不多,正如Django黑客James Bennett所说的那样:请为了Guido的爱,请停止使用setuptools和easy_install,并使用distutils和pip代替。有关差异的in-depth讨论,请参阅James Bennett(来自django)的On packaging和来自Ian Bicking(来自mozilla)的A Few Corrections To “On Packaging”。
如果您想要安全,请使用virtualenv尝试您的pip部署。这为您提供了一个独立的python环境,因此您可以确保您的应用程序可以在任何计算机上运行。
稍等一下,我相信有些人会不同意我的观点。