有没有办法在Linux上安装一个程序的多个版本?

有没有办法在Linux上安装一个程序的多个版本?

我正在尝试php-5.3在 Arch Linux 上安装,但bison它太新了,所以我从源代码构建了旧版本bison。看起来它/usr/local默认安装到其中。 (这是某种约定吗?)所以我现在想知道是否可以安装多个版本的bisonie,与默认系统版本和我刚刚安装的版本并排安装。这类东西可能很少需要。我只是好奇而已。这是一件很难做的事情吗?我该怎么办?

答案1

一些特定的软件可以配置--program-suffix=-my-version-suffix。您可能需要自定义一些其他目录,但如果您将 保留--prefix为默认值 ( /usr/local),则不会与/usr.

在里面一般的然而,唯一尝试允许共同安装任意版本的发行版是尼克斯, 尽管根图尝试比大多数发行版更多的软件包(尽管对于 Bison 来说它一次只允许一个版本 - 至少它提供了一种选择)。

但请注意,如果您的源代码在较新版本的 bison 中出现问题,通常意味着您的源代码存在一个简单的问题。通常有一些%option(或--argument)可以修复它。

答案2

一致解决此问题的一种方法是使用modules包裹。它通过更改环境变量(例如二进制文件的路径)来工作。

环境模块包提供通过模块文件动态修改用户环境的功能。模块可以以干净的方式动态、原子地加载和卸载

例如

$ module load gcc/3.1.1 
$ which gcc 
/usr/local/gcc/3.1.1/linux/bin/gcc 

$ module switch gcc gcc/3.2.0 
$ which gcc 
/usr/local/gcc/3.2.0/linux/bin/gcc 

在您的情况下,将选择环境变量bison中第一个版本PATH。要为当前终端手动检查或更改此变量,请运行

$ echo $PATH
 ....

通过 _pre_pending 将其优先/opt/bin到 PATH:

$ export PATH="/opt/bin:$PATH"

或者,附加/opt/bin/PATH(仅当在其他地方找不到同名二进制文件时才选择PATH

$ export PATH="$PATH:/opt/bin"

答案3

只是为了给出更新的答案:

是的,这在当今绝对是可能的。
依赖地狱已经成为过去,除非发行版也是如此。 :)

Arch 并没有削减它。您需要一个基于源的发行版。由于依赖关系将被硬编码(对于硬编码的某些定义),并且两个安装都将指向相同的库等。
但是从源代码构建时,您可以每次使用不同的路径构建它。

Gentoo 长期以来一直有一个名为“slotting”的功能,这使得整个事情变得微不足道。一个包的某个版本的依赖关系可以指定为另一个包的某个“槽”。插槽是不与任何其他插槽冲突的一系列版本。 (对于我见过的大多数包,任何版本都可以是它自己的插槽。特别是对于库。但有时一个包无法处理它,因为它本身依赖于只有一个的东西。或者因为它需要一些从包管理器工作[例如在安装时修改已安装的配置文件])

但我确信任何其他完整源代码发行版都会有类似的东西。

否则,解决方法始终是设置与维护者构建发行版包相同的构建系统,以新名称克隆所需的包,并在其中更改构建过程以指向不同版本的依赖项,然后将其构建到一个新的非源包中,就像您的发行版的包维护者所做的那样。 (坦白说,我发现 Gentoo 更容易安装。:)

相关内容