3

我的应用程序使用 Mochiweb。据我了解,rebar当我运行时从 Github 获取最新版本make,因为有一行rebar.config

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

我的应用程序有一个 VCS,它是 git。所以,基本上我在另一个里面有一个 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

我的问题是:将另一个应用程序添加到 Erlang 应用程序的部门以允许其他开发人员在不使用 git 子模块的情况下轻松更新的正确方法是什么?

4

3 回答 3

5

将另一个应用程序添加到 Erlang 应用程序的部门以允许其他开发人员在不使用 git 子模块的情况下轻松更新的正确方法是什么?

将应用程序添加到 rebar.config 并使用:

./rebar update-deps

用于更新。第一次,您需要使用:

./rebar get-deps

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

现在,回到你的错误。

我的感觉是,您的部门中有一个(几乎)空的 mochiweb 目录,可能是由于使用了 Git 子模块。当您运行该get-deps命令时,rebar 会默默地丢弃 mochiweb,因为该目录已经存在。但它需要一个 OTP 应用程序并查找mochiweb.app不存在的文件(目录为空)。因此,错误。如果我的解释是正确的,你可以简单地做:

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

不过,看看你的 rebar.config 会有所帮助。

于 2012-05-17T07:31:28.597 回答
4

在我们内部的 Erlang 项目中,我们使用Git 子树合并方法来引用依赖项。在我看来,即使rebar get-deps是获取github托管项目依赖项的简便方法,但在公司环境中并不是那么好:

  1. github需要可以从每台构建机器访问(并且依赖项的源代码是硬编码的rebar.config
  2. 你依赖于不那么精确的依赖项目愿景(你能指出具体的提交吗?)。不仅无法重现项目过去的状态(当时包含所有依赖项),而且更糟糕的是,一旦更新了某些依赖项github(不更新其版本),您的项目也很容易被破坏。
  3. 如果要自定义依赖项目怎么办?就像依赖项目的“rebar.config”文件中的一个小改动?

因此,get-deps我们不是为每个依赖项目使用单独的分支(+ 远程指向特定github项目),而是将 git subtree 合并到我们项目分支上的“dep”目录中。实际上,我们将所有依赖项存储在主分支中,但这样我们就解决了上述所有问题:

  1. 您可以通过从我们的内部 git 存储库中提取项目主分支(或开发等)来获得整个代码库。它可以立即构建。
  2. 所有依赖项的精确版本都被子树合并到我们的主分支中,我们仅在我们想要/需要时更新到更新版本的依赖项:只需切换到依赖项分支,git pull然后它们子树将某些特定版本的依赖项合并到主分支中分支。您可以随时获取整个项目的任何过去版本。
  3. 一旦需要更新依赖项,就可以在其自己的分支(或另一个自定义分支)中自定义依赖项:您必须git merge使用最新的代码进行更改,但这通常不是问题。您甚至可以将远程指向您自己的存储库(分叉github或内部)。

当然,我们不会以这种形式(包括所有依赖项)在“github”上发布我们的项目,但您可以在单独的分支上剥离所有依赖项(通过删除“dep”文件夹)并发布结果。这种方法的缺点是依赖项更新有点麻烦:rebar get-deps您不必为要更新的每个依赖项都执行git push+ git merge -s subtree,但这只是严格的依赖项管理和易于构建的结果。

于 2012-05-18T05:00:23.677 回答
1

我认为您正在寻找 rebar get-deps 命令。看看 Riak 使用的Makefilerebar.config就是一个很好的例子。

于 2012-05-16T20:42:19.837 回答