2

redisに接続するために、Erlang プロジェクトにedisを含めようとしています。私はそれを 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)、含まれているライブラリを使用しようとすると爆発しますか?

4

1 に答える 1

2

include_lib は常に小さな混乱の原因でした。include_lib の動作は include とほぼ同じですが、ファイルパスを指すべきではありません。include_lib では、最初のパス コンポーネントがアプリケーションの名前であると見なされます。

例えば

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

code:lib_dir(lib) を使用して現在の (最新) バージョンの lib のディレクトリを見つけ、サブディレクトリ include でファイル erdis/include/erdis.hrl を検索します (パターン置換を無視します)。

Erlang で一般的に好まれる依存関係の戦略は、 rebar を使用してコンパイルし、適切な依存パスを via に渡すこと-paです。ただし、sans rebar セットアップでは、-pa ../lib/eredis/include/eredis.hrlコンパイル後に直接 erl に渡すことになります。-paそのディレクトリをコードパスに含めます。

于 2012-09-02T18:06:10.370 に答える