我有一个正在生产的CentOS 6服务器,实际上正在托pipe几个站点。 我现在应该安装在Ruby上运行的Redmine。 remi / ephel存储库给了我Ruby 1.8.7,但我想使用最新的版本(1.9)。 问题是,我应该自己编译和安装它,下载源代码和所有其他需要使gem工作的开发包,例如mysql-devel for mysql2适配器。 在生产机器上安装dev-packages是不好的做法? 安全性能否被破坏? 我应该坚持存储库提供的默认包吗?
留在供应商的包pipe理系统中会更好。
也就是说,如果你需要一个软件的更新版本,至less要尝试使用软件包,而不是通过make; make build来安装make; make build make; make build 。
对于Ruby 1.9.3,有人制作了一个spec文件:
https://github.com/imeyer/ruby-1.9.3-rpm
你应该可以使用这个来制作Ruby 1.9.3的RPM,并以这种方式进行安装。 如果没有别的,它会使更新更容易(即, rpm -Uhv ruby-1.9.3而不是make; make install )。 当然,你将仍然负责为自己生成新的Ruby 1.9包。
一般来说,安装软件的优先级是等级的。
供应商存储库提供的软件。 在这种情况下,您将使用友善的pipe理系统来安装和更新由供应商维护的软件包(例如,yum,apt-get)。
通过第三方存储库提供的软件。 在这里应该有一个小型的层次结构,在那里你有着名的知识库(例如CentOS的EPEL),而不是那些不那么重要的库(例如,某个人在Ubuntu上的PPA;我并不是说人们试图通过安装特洛伊木马程序PPA,更重要的是,这通常是由某人可能不提供软件包,或者可能没有find兼容性问题的人提供的)。
通过自己构build的软件包安装软件。 这是之前提到的spec文件会下降的地方。 你将在发行版的包系统中包装构build过程,因此安装和升级很容易(例如, rpm -e ,而不是通过/ usr / local查找以encryption命名的文件)。 随着更新的出现,您将承担构build新软件包的责任。
软件没有包pipe理安装。 这是经典的wget software.tgz ; tar xzvf software.tgz ; cd software ; ./configure ; make ; make install wget software.tgz ; tar xzvf software.tgz ; cd software ; ./configure ; make ; make install wget software.tgz ; tar xzvf software.tgz ; cd software ; ./configure ; make ; make install 。 一般来说,你会把文件全部放在/ usr / local; 可能很难获得有关软件的信息(例如,您可以简单地运行rpm -q或rpm -ql ),并且将很难删除。 这应该是最后的手段。
我想在3左右的地方是Alex提到的rvm方法。 这不是真的在系统包中,但有一个围绕Ruby安装的框架。 在Ruby中,在RVM上下文中,与特定Ruby相关的gem将通过gem install并在特定的框架中进行pipe理,尽pipe不是OS的包pipe理系统。
除非你有要求使用最新版本,否则坚持使用“官方”版本通常被认为是一件“好事”。 安全补丁被反向移植到官方软件包中,您可以利用软件包pipe理器的更新和依赖关系解决scheme。
一旦你走出上述的事情可以变得相当凌乱。
这是一个意见的问题,但是我从来不直接在生产机器上从源代码安装软件包。 这使得应用安全更新变得更加困难。 我对这个道路上的一个潜在的妥协感到有点偏执。
我倾向于在可能的情况下使用内置软件包,并根据需要追踪外部来源的额外RPM。 如果找不到我需要的版本,我可以在开发包中自己将软件包构build到RPM中,然后将该新RPM部署到生产环境中。 不优雅,但function。
我总是使用RVM创build和pipe理Ruby环境,RVM似乎是许多Ruby专家安装Ruby的首选方式。 Debian和CentOS的维护人员提供的软件包还没有达到速度。 而且,RVM能够像Python的virtualenv一样创build独立的虚拟环境。