2

我正在尝试将eredis包含在我的 Erlang 项目中以连接到 redis。我将它放在 lib/ 目录中,并使用-include_lib ("../lib/eredis/include/eredis.hrl").It compiles fine in erl,但随后尝试创建客户端失败** exception error: undefined function eredis:start_link/0

redis_worker.erl:

-module (redis_worker).
-export ([get/2, set/3, client/0]).
-include_lib ("../lib/eredis/include/eredis.hrl").

client() ->
  eredis:start_link().

get(Client, Key) when is_list(Key) ->
  {ok, Val} = eredis:q(Client,["GET", Key]),
  io:format("Got key: ~s which had value ~s~n", [Key, Val]).

set(Client, Key, Value) when is_list(Key) andalso is_list(Value)->
  {ok, <<"OK">>} = eredis:q(Client, ["SET", Key, Value]),
  io:format("Set key: ~s to ~s~n",[Key, Value]).

为什么它编译得很好(我假设这意味着执行include_lib)但是当我尝试使用包含的库时会爆炸?

4

1 回答 1

2

include_lib 一直是引起轻微混淆的根源。include_lib 的行为与 include 几乎相同,但不应指向文件路径。在 include_lib 中,第一个路径组件被假定为应用程序的名称。

例如

-include_lib("../lib/eredis/include/eredis.hrl").

将使用 code:lib_dir(lib) 查找当前(最新)版本 lib 的目录,然后在子目录 include 中搜索文件 eredis/include/eredis.hrl(忽略模式替换)。

值得注意的是,Erlang 中通常首选的依赖策略是使用 rebar 并编译并在 via 中传递适当的依赖路径-pa。但是,在您的无钢筋设置中,这意味着-pa ../lib/eredis/include/eredis.hrl在编译后直接传递给 erl。-pa将该目录包含到您的代码路径中。

于 2012-09-02T18:06:10.370 回答