Erlang 使用钢筋处理外部LIB

Erlang 使用钢筋处理外部LIB,erlang,dependency-management,rebar,Erlang,Dependency Management,Rebar,我想在我的应用程序中使用一些lib,比如。该repo持有src dir,但没有.app文件(因为它不是应用程序),所以我不能使用get deps 我尝试了另一种方法,在sub_dirs中添加一个libsdir,并将repo添加为git子模块,但力霸不会编译它的任何文件。我猜rebar只编译otp应用程序,而不只是编译未绑定到应用程序的.erl文件 您如何管理这些依赖关系?我希望避免将这些文件复制到我的app dir,因为我认为它们不属于那里,而且我有点喜欢git子模块方法,它允许我跟踪我正在使用

我想在我的应用程序中使用一些lib,比如。该repo持有src dir,但没有.app文件(因为它不是应用程序),所以我不能使用get deps

我尝试了另一种方法,在sub_dirs中添加一个libsdir,并将repo添加为git子模块,但力霸不会编译它的任何文件。我猜rebar只编译otp应用程序,而不只是编译未绑定到应用程序的.erl文件

您如何管理这些依赖关系?我希望避免将这些文件复制到我的app dir,因为我认为它们不属于那里,而且我有点喜欢git子模块方法,它允许我跟踪我正在使用的lib版本。

使用rebar创建应用程序和发布的更大过程

更具体地说,我认为
rebar.config
中的这个选项可能就是您想要的。到目前为止,我发现的唯一方法是每个应用程序都有一个条目:

{sub_dirs, ["libs/app1",
            "libs/app2",
            ...]}.

这需要更多的手工工作。不幸的是,rebar的结构非常简单,只包含一个应用程序,因此需要更好的支持来维护一个存储库,该存储库包含一组价值相等的应用程序,而不是一个应用程序。

请Agner的同事将其添加到包管理系统中。在此过程中,他们将创建一个分叉并进行转换,以使项目钢筋兼容。另外,原始的维护人员很可能会集成这些更改。

如果您使用的是Linux,您可以将所需的模块作为硬链接添加到应用程序的src目录中


这远不是最优的,但我还没有找到更好的方法来实现这一点。

最近的钢筋支持依赖项的
raw
选项。如果此选项是特定的,则钢筋不要求依赖项具有标准的Erlang/OTP布局,该布局假定存在“src/dependency_name.app.src”或“ebin/dependency_name.app”文件(请参阅更多详细信息)

例如:

{deps, [
  {erlang_ruby_marshal, "",
    {git, "https://github.com/Panmind/erlang-ruby-marshal", {branch, master}},
    [raw]}
]}.

请注意,rebar现在可以获取它,但它仍然不会编译它。正如其他评论者所指出的,没有理由不让这个依赖项有一个
.app
文件。我会分叉存储库并将
.app
文件添加到其中。

为什么它不是应用程序?你可以有一个只是模块集合的应用程序(不使用
{mod,…}
选项)。这很有趣,但因为我是从现有存储库中提取的,所以没有.app文件。是的,我试过了,但是力霸没有在libs dir中编译任何erl文件。确切地说,我添加了“libs/erlang ruby marshal”dir,它有src dir,但正如我所说的,rebar在那里不编译任何东西。找到了一种方法。在我看来,这并不完全令人满意,因为在添加、删除或重命名应用程序时需要手动干预。我仍然需要一个.app文件,而且由于git子模块没有一个,因此该方法将不起作用。rebar用于与OTP兼容的应用程序,因此如果您的代码不符合OTP标准,你可能会因为使用钢筋而运气不佳。这似乎是一件方便的东西。你是否考虑过向主钢筋项目提交一个拉动请求?@克洛夫雷什,是的,我仍然考虑这样做。本周我将设法抽出一些时间来正确地实现它——这比我最初简单的复制粘贴需要更多的工作,只需3次编辑。@clofresh,我重新审视了这个问题,并提交了新版本作为请求:请随意在那里留下一些评论。这可能有助于更快地将其合并。@clofresh,该修补程序已最终被接受。现在它是标准钢筋的一部分。