为什么我不应该更新我所有的 CPAN 模块?

Why should I not update all my CPAN modules?

我认为定期更新计算机上的所有软件通常是个好主意。由于 CPAN 模块不是由我的包管理器管理的,我想我应该每隔一段时间做一次 cpan -u。只有在执行此操作后,我才阅读有关此的手册页注释:

-u  Upgrade all installed modules. Blindly doing this can really break
   things, so keep a backup.
  1. 为什么这会破坏任何东西?否则我应该如何使我的 CPAN 模块保持最新状态;我是否需要跟踪所有手动安装的模块(cpan 似乎没有这样做)并且只定期更新这些模块?我手动安装的模块的依赖关系如何?
  2. 为什么 cpan -u 升级了 ~15 分钟,即使我没有安装单个 CPAN 模块?
  3. 我可以还原 cpan -u 吗?为此删除 ~/.cpan 是否足够?

Why should this break anything?

它不应该,但是复杂的系统很复杂,有时事情确实会中断(例如,如果一个模块更新了一个非向后兼容的更改,或者依赖于一个 C 库,它有错误,这些错误只会在组合中出现具有特定的依赖关系)。

And how should I keep my CPAN modules up to date otherwise;

只要保留备份以防万一。

Why did cpan -u upgrade stuff for ~15min even though I haven't installed a single CPAN module?

Perl 随 large collection of modules 分发,您的分发可能已经安装了其他模块。

Can I revert the cpan -u?

您可以使用文档推荐的备份覆盖它。

Is it enough to delete ~/.cpan for this?

没有。安装程序工具使用该目录来缓存有关可用模块的数据、存储源代码和保存构建工件。安装的文件会像任何其他库一样写入您的 lib

  1. 新的或更新的代码是新的或更新的错误。我和 Quentin 持相反的观点:为什么改变一堆东西不会破坏东西?这是我对大多数更新的期望。然而,Perl 5 搬运工竭尽全力针对尽可能多的 CPAN 测试 perl 发行版。这并不意味着您对模块的特定使用(以及您解决现有错误的方式)是稳定的。

  2. 一些perl自带的模块也在CPAN上。这些是 "dual-lived" 个模块,它们可能会从 CPAN 更新。

  3. cpan 工具不会为您还原任何内容,但有时您可以像我一样做。使您的安装成为 git 存储库。更改时分支。用你的代码尝试分支。如果出现任何问题,您可以随时切换回 master。您甚至不需要提交更改! Pinto 等工具可帮助您管理 Perl 模块集。


还有其他一些事情需要考虑。

首先,我建议你不要乱用系统perl。让系统来做。如果您想要自己管理的更新的 perl,请安装一个不同的。你可能会喜欢 perlbrew(我不喜欢,但这没什么大不了的)。

你可以随心所欲地搞砸那个,系统不会开始做奇怪的事情。考虑像 removing . from @INC and Deprecating unescaped left braces in regexes 这样的重大变化。这些是 perl 中的更改,但它们破坏了一些重要的东西。

其次,您可以将 cpan 配置为安装在系统目录之外的某个地方。 -I 开关将使用 local::lib for you. Besides that, you can configure it manually.