Git 子模块和 rebar

3
我的应用程序使用Mochiweb框架。据我所知,当我运行make命令时,rebar会从Github上获取最新版本,因为在rebar.config文件中有这样一行代码。
{deps, [
  {mochiweb, ".*",
   {git, "git://github.com/mochi/mochiweb.git", "master"}}

我的应用程序有一个版本控制系统,它是git。因此,本质上我在另一个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

我的问题是:在不使用git子模块的情况下,如何将另一个应用程序添加到Erlang应用程序的“deps”中,以便其他开发人员可以轻松更新?

3个回答

5
如何将另一个应用程序添加到Erlang应用程序的依赖项中,以便其他开发人员可以轻松更新而不使用git子模块?
将该应用程序添加到rebar.config中并使用以下命令:
./rebar update-deps

更新操作。第一次需要使用:

./rebar get-deps

请参见: https://github.com/basho/rebar/wiki/Rebar-commands 现在回到您的错误。
我认为您在deps中有一个几乎为空的mochiweb目录,这可能是由于使用Git子模块玩耍所导致的。当您运行”get-deps”命令时,rebar会静默丢弃mochiweb,因为该目录已经存在。但它希望获得OTP应用程序,并查找“mochiweb.app”文件,但该文件不存在(该目录为空)。因此,出现了错误。如果我的解释正确,您可以简单地执行以下操作:
rm -rf deps/mochiweb
./rebar get-deps

查看您的rebar配置文件可能会有所帮助。

在尝试推送到Heroku几乎三天后,终于解决了这个问题...... - Oladipo Olasemo

4
在我们内部的Erlang项目中,我们使用Git子树合并方法来引用依赖项。在我看来,虽然rebar get-deps是获取github托管项目依赖项的方便方式,但在企业环境中并不那么好:
  1. github需要从每台构建机器都可以访问(并且依赖项的源代码在rebar.config中被硬编码)
  2. 你依靠依赖项目的版本控制,而这并不是那么精确的(你能指向特定的提交吗?)。不仅不可能重新创造出过去项目的状态(包括所有依赖项),而且更糟糕的是,一旦某个依赖项在github上更新(而不更新其版本),你的项目也很容易被破坏。
  3. 如果您想要自定义依赖项项目,该怎么办?比如在一个依赖项目的'rebar.config'文件中进行小改变?
因此,我们使用单独的分支(+指向特定github项目的远程)来代替get-deps,将每个依赖项目作为git子树合并到我们项目分支的“dep”目录中。实际上,我们将所有依赖项存储在主分支中,但这样我们解决了以上所有问题:
  1. 通过从我们的内部git存储库拉取项目主分支(或dev等),您可以获取整个代码库。它立即可构建。
  2. 所有依赖项的精确版本都被子树合并到我们的主分支中,只有当我们想要/需要更新依赖项时,才会更新到新版本:只需切换到依赖分支,执行git pull,然后将某个特定版本的依赖项子树合并到主分支中。您随时可以获取任何过去版本的整个项目。
  3. 一旦到了更新依赖项的时间,依赖项可以在其自己的分支(或另一个自定义分支)中进行自定义:您必须使用git merge将最新代码与您的更改合并,但通常不是问题。您甚至可以将您的远程指向您自己的存储库(在github或内部派生)。
当然,我们不会以这种形式(包括所有依赖项)在'github'上发布我们的项目,但您可以通过删除“dep”文件夹来剥离所有依赖项,并在单独的分支上发布结果。这种方法的缺点是需要处理依赖更新的一些麻烦:您需要为每个要更新的依赖项执行git push + git merge -s subtree而不是rebar get-deps,但这只是严格依赖管理和构建易用性的结果。

我真的很喜欢这种方法。谢谢你分享你的工作流程。 - adammokan
你也可以fork Github仓库,然后依赖于你自己在Github上的副本。你可以标记你所依赖的版本,并在rebar.conf中配置该标记。这样所有的不安全因素都会消失,而且你以后仍然可以使用该版本(因为rebar.conf也受到你主要仓库的版本控制)。顺便说一下,我从来没有遇到过访问Github的问题。 - mit

1

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


谢谢提供链接。我在我的rebar.config中有一个get-deps命令,当我运行Makefile时它就失败了(我猜是这个原因)。 - skanatek
你能分享一下你现在Makefile和rebar.config里的内容吗? - klm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接