我正在尝试将eredis包含在我的Erlang项目中以连接到redis。我把它放在一个lib /目录中,并使用-include_lib ("../lib/eredis/include/eredis.hrl").
它在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
)但是当我尝试使用包含的库时会爆炸?
答案 0 :(得分:2)
include_lib一直是轻微混淆的根源。 include_lib的行为几乎与include相同,但不应指向文件路径。在include_lib中,假定第一个路径组件是应用程序的名称。
例如
-include_lib("../lib/eredis/include/eredis.hrl").
将使用代码:lib_dir(lib)查找当前(最新)版本lib的目录,然后在子目录include中搜索文件eredis / include / eredis.hrl(忽略模式替换)。
值得注意的是,Erlang中依赖的一般首选策略是使用rebar并编译并传递via -pa
中的相应依赖路径。但是,在你的sans rebar设置中,这意味着在编译后直接将-pa ../lib/eredis/include/eredis.hrl
传递给erl。 -pa
会将该目录包含在您的代码路径中。