2012-03-05 47 views
1

這可能是一個明顯的問題,但我在搜索最佳實踐方面遇到了困難。我使用的是Rails 3.0和Bundler。如何鎖定我的導軌項目的寶石?

我開始在我的工作筆記本電腦上開發Rails應用程序。我將寶石名稱添加到我的gem文件並運行軟件包安裝。當我這樣做時,我並沒有太在意我需要什麼版本的寶石,我只是讓Bundler安裝最新版本。一切工作正常。

我把這個應用程序推到Heroku,它只是工作。

  1. Heroku是否使用我的Gemfile.lock文件中定義的gem版本?還是它使用Gemfile獲取最新版本並安裝它們?

    然後我拿到了一臺新的筆記本電腦。所以我決定在該筆記本電腦上克隆git repo。我安裝了RVM,克隆了GitHub的repo,然後在本地運行軟件包安裝。問題是因爲我沒有在Gemfile中指定gem版本,所以運行bundle install下載了最新的gem版本。我做了一些CSS更改並推送到Heroku,並驚訝地發現應用程序被破壞。顯然,回形針寶石現在需要一些其他的寶石或其他東西。

    因此,我查看了Gemfile.lock上的git日誌,發現了以前的回形針工作版本,並將該版本號放入Gemfile中。重新加入到heroku中,它再次運行。

  2. 如何避免此問題的發生?我應該總是把寶石版本號放進我的Gemfile中嗎?我應該售賣我的寶石(我以前沒有做過,怎麼做)?

+1

您確定*它安裝了最新版本嗎?你沒有把Gemfile.lock文件簽入你的倉庫嗎? – 2012-03-05 17:42:06

+0

是的,我確實有Gemfile.lock簽入我的回購。但是當我在我的新筆記本上運行bundle安裝時,它獲取了最新的gem版本並覆蓋了本地的Gemfile.lock。 – Homan 2012-03-07 21:16:52

+0

如果這真的發生了,那麼你在Bundler遇到了一個錯誤。確保你使用的是Bundler的最新版本,如果你能夠明確地複製這種行爲,請[報告](https://github.com/carlhuda/bundler/issues/new)。 – 2012-03-07 21:27:57

回答

1

問題一,取決於寶石是如何宣稱到的Gemfile:例如聲明gem "omniauth",將最後omniauth寶石捆綁成的Heroku Gemfile.lock的在部署/編譯時間,而如果你指定gem "omniauth", "0.3.4",你會得到完全Heroku上的「0.3.4」。

Vendoring在軌> = 3.2.2

棄用,是的,最好指定所有的gem版本到Gemfile中,當你需要,DOIT一次一個通過將後本地運行bundle update omniauth更新Gemfile中的新版本...

+0

爲什麼vendoring棄用?如果舊的寶石版本不再可用,會發生什麼? – Homan 2012-03-07 21:14:40

+0

這是不正確的。唯一修改Gemfile.lock的命令(假設它已經存在)是'bundle update'。 – 2012-03-07 21:29:21

+0

@sketchfemme供應商已被棄用,因爲這是一種糟糕的管理方式。 Rubygems上可用的寶石將繼續可用,只要rubygems。org正在運行,所以我沒有真正看到那裏的問題。 Rails 4.0中的供應將會消失。 – 2012-03-07 21:30:48