2012-08-31 40 views
6

我想运行一个应用程序取消Github。如何从Gemfile.lock文件安装宝石?

我已经运行bundle install安装Gemfile所需的宝石。但是,当运行应用程序时,错误消息告诉我安装的gem是错误的版本。

在检查Gemfile.lock时,我注意到版本比安装的gems旧。 (即,我安装了更新版本的宝石,并且应用程序需要更老的宝石。)

是否有一种快速方法来安装Gemfile.lock文件中描述的所有版本?另外还有一种方法可以忽略该文件?

的Gemfile:

source 'http://rubygems.org' 
    gem 'rails', "3.0.9" 
    gem "sass" 
    .. 

Gemfile.lock的:

sass (3.1.1) 
.. 

在上述例子中,即使SASS安装了该应用专门需要版本3.1.1。

+0

Bundler应该总是将版本安装在'Gemfile.lock'文件中,这是它的目的。你有没有安装在你的系统上的那些gem版本? – janders223

+0

我安装了比应用程序指定的更新的宝石。当我运行软件包安装时,会安装最新的可用gem版本。 – dmuk

+3

只需删除锁定文件并再次进行捆绑。 – emrahbasman

回答

6

确保您正在运行的bundle execute rails server

+1

+1,你需要从bundler运行服务器,以便它使用正确的宝石。 –

9

web服务器采用一个有效的Gemfile.lock文件,单独bundle install应该是足够了,除非一些特殊的宝石版本已猛拉。在这种情况下,您需要寻找目前仍然可用的替代宝石版本(通常bundle update name_of_yanked_gem就足够了)。

关于sass 3.1.1,就没有这么多的应用程序需要特定版本,而是,这是有可能的最新版本时Gemfile.lock最后生成/更新定为Gemfile指定的总体版本的约束。如您所列,没有为sass本身指定版本范围,但其他宝石可能会施加进一步的限制,如果它们具有sass作为依赖关系。

忽略Gemfile.lock不是一个好主意,因为在正常情况下,它将指定上次被认为可以与应用程序一起使用的gem版本。

+0

你确定软件包安装是否足够?例如,如果安装了同一个gem的多个版本会怎么样?(通常情况下)?我认为这就是'bundler执行'的目的。 – Dty

+0

无论如何,如果生成了'Gemfile.lock',那么在解析总体约束后,它将只包含每个指定gem的一个版本。 'bundle install'用于安装,'bundle exec'用于执行。 – prusswan

+0

好的,我想你回答了提问者原来的问题:“我该如何安装宝石”。我正在回答我认为他真正的问题是什么。 – Dty

2

试试这个..

bundle install --deployment 

通过上面部署选项,捆绑然后从Gemfile.lock的读取。

更重要的是,宝石被安装到目录供应商/束,同捆目录是自动创建

此外,新目录.bundle限定在轨道根目录下直接创建,并有一个名为的配置文件,其内容如下:...

BUNDLE_FROZEN: '1' 
BUNDLE_PATH: vendor/bundle 
BUNDLE_DISABLE_SHARED_GEMS: '1' 

希望以上对你的作品。