2012-05-16 80 views
3

我的應用程序使用Mochiweb。據我瞭解,rebar獲取從GitHub最新版本,當我運行make,因爲在rebar.config線:Git子模塊和螺紋鋼

{deps, [ 
    {mochiweb, ".*", 
    {git, "git://github.com/mochi/mochiweb.git", "master"}} 

我的應用程序有一個VCS,它是飯桶。所以,基本上我裏面有一個又一個的Git倉庫:

myapp 
.git 
deps 
    mochiweb 
    .git 
src 
etc 

我知道,加一個Git倉庫內另外一個是不是一個好主意(git add .)。應該使用Git子模塊功能。

因此,我將deps/mochiweb目錄作爲子模塊添加到主git存儲庫。

問題是,當另一個開發人員克隆主存儲庫時,他必須首先爲initupdate子模塊獲取deps/mochiweb(否則它將爲空)。

如果開發商只是運行他克隆的主要倉庫後make權,Makefile中說以下內容:

ERROR: Dependency dir deps/mochiweb failed application validation with reason: 

{missing_app_file,"deps/mochiweb"} 

make: *** [all] Error 1 

我的問題是: 什麼是增加另一個應用的在DEPS的正確方法Erlang應用程序允許其他開發人員輕鬆更新而不使用git子模塊?

回答

5

什麼是添加另一種應用一個Erlang 應用的DEPS以允許其他開發人員很容易更新,而無需使用Git 子模塊的正確方法?

的應用程序添加到rebar.config及用途:

./rebar update-deps 

對於更新。第一次,你需要使用:

./rebar get-deps 

參見:https://github.com/basho/rebar/wiki/Rebar-commands

現在,回到你的錯誤。

我的感覺是,你有一個(幾乎)空的mochiweb目錄在你的deps,可能是因爲玩Git子模塊的結果。當您運行get-deps命令時,鋼筋默默丟棄mochiweb,因爲該目錄已經存在。但它期望OTP應用程序並尋找mochiweb.app文件,該文件不在那裏(目錄爲空)。因此,錯誤。如果我的解釋是正確的,你可以簡單地做:

rm -rf deps/mochiweb 
./rebar get-deps 

雖然看看你的rebar.config會有所幫助。

+0

在試圖推向heroku的這個問題上花費了近三天的時間。這終於解決了這個問題....... –

1

我認爲你正在尋找rebar get-deps命令。看看Riak使用的Makefilerebar.config就是一個很好的例子。

+0

感謝您的鏈接。我在我的rebar.config中有一個get-deps命令,這就是我運行Makefile時失敗的地方(我想)。 – skanatek

+0

你可以在你的Makefile和rebar.config中分享你現在擁有的東西嗎? – klm

4

在我們內部的Erlang項目中,我們使用Git subtree merge方法來引用依賴關係。在我看來,即使rebar get-deps是handly的方式來獲得依賴於一個github託管項目是不是在企業環境中的好:

  1. github需要從每次構建機器(和依賴的資源訪問在rebar.config是硬編碼)
  2. 你依靠依賴項目遠景規劃這是不是準確的(你可以指向具體的承諾?)。它不僅是不可能重現項目的狀態在過去(與當時所有的依賴),但更糟的是,你的項目也可以輕鬆一些,一旦依賴上github更新破(不更新該版本) 。
  3. 如果您想定製相關項目,該怎麼辦?就像依賴項目的'rebar.config'文件中的一個小改動一樣?

所以不是get-deps我們使用一個單獨的分支(+遙控器指向特定github項目),爲每一個依賴項目和Git樹其合併到我們的項目分支「出發」目錄。我們實際上存儲在主分支的所有依賴關係,但這樣我們解決所有上述問題:

  1. 您從我們的內部Git倉庫拉項目的主要分支(或開發者等)獲得整個代碼庫。它立即可以建立。
  2. 所有依賴的準確版本是子樹合併到我們的主要分支,我們更新到依賴的新版本,只有當我們想/需要:只需切換到依賴分支,做git pull並將其子樹合併的一些特定版本對主分支的依賴。您可以隨時獲得整個項目的任何過去版本。
  3. 依賴可以在它自己的分支進行定製(或其他定製的分支),一旦它的時間來更新依賴性:你將不得不git merge最新的代碼更改,但它通常是沒有問題的。您甚至可以將您的遙控器指向自己的存儲庫(在github或內部分叉)。

當然,我們不會在'github'上以這種形式發佈我們的項目(包括所有依賴關係),但是您可以去除單獨分支上的所有依賴項(通過刪除'dep'文件夾)併發布結果。這種方法的缺點是依賴更新麻煩的一點:不是rebar get-deps你要做的git push + git merge -s subtree爲每個依賴要更新,但它僅僅是建立嚴格依賴管理和容易的結果。

+0

我真的很喜歡這種方法。感謝您分享您的工作流程。 – adammokan

+0

你也可以分叉github倉庫,然後依靠你自己的github副本。您可以標記您依賴的版本並在rebar.conf中配置標籤。這樣,所有的不安全性都會消失,你還可以在以後使用這個版本(因爲rebar.conf也是版本控制在你的主版本庫中)。順便說一句,我從來沒有任何問題訪問Github。 – mit