使用钢筋处理外部库

时间:2011-04-01 07:55:48

标签: erlang dependency-management rebar

我想在我的应用程序中使用一些库,例如https://github.com/Panmind/erlang-ruby-marshal。那个repo拥有一个src目录,但没有.app文件(因为它不是一个应用程序),所以我不能使用get-deps。

我尝试了另一种方法,在sub_dirs中添加 libs 目录,并将repo添加为git子模块,但是rebar不会编译任何文件。我猜这个rebar只编译otp应用程序,但不仅仅是.erl文件没有绑定到应用程序。

你如何管理这种依赖?我想避免将文件复制到我的app目录,因为我不认为它们属于那里,我有点像git子模块方法,它允许我跟踪我正在使用的lib版本。

4 个答案:

答案 0 :(得分:3)

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

例如:

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

请注意,钢筋现在可以获取它,但它仍然无法编译它。正如其他评论者指出的那样,没有理由为什么这种依赖不应该有.app文件。我会分叉存储库并将.app文件添加到它。

答案 1 :(得分:2)

This article经历了使用螺纹钢创建应用程序和版本的更大过程。

更具体地说,我认为rebar.config中的此选项可能正是您所寻找的。我到目前为止找到的唯一方法是为每个应用程序创建一个条目:

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

这需要更多的手动工作。不幸的是,钢筋只是围绕一个应用程序的概念而构建,并且需要一些更好的支持,以便使用一堆同等价值的应用程序而不是单个应用程序来管理存储库。

答案 2 :(得分:1)

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

这远非最佳,但我还没有找到更好的方法来做到这一点。

答案 3 :(得分:0)

让Agner小伙将它添加到他们的包管理系统中。在这个过程中,他们将创建一个fork并进行转换,以使项目rebar兼容。此外,原始维护者很可能会整合这些更改。