2017-01-12 7 views
2

lib/、具体的にはlib/my_namespace/test_module.exsの中にモジュールを作成しました。 Phoenixプロジェクトのlib/folderに定義されているモジュールを使用するにはどうすればよいですか?

これ

はすべてのことが、その中に定義されています:フェニックスコントローラー内のこのモジュールの test()関数を呼び出す

defmodule MyNamespace.TestModule do 
    def test do 
    "This is a test" 
    end 
end 

エラーをレンダリングします。

** (UndefinedFunctionError) function MyNamespace.TestModule.test/0 is undefined (module MyNamespace.TestModule is not available) 
    MyNamespace.TestModule.test() 

Elixir 1.2.0 Changelogによれば、エリクサーがlib/ディレクトリ内のコードをリロードすることを意味することが私の理解ですので、私の仮定は、私は他に何もする必要はありするつもりではなかったということです。

私は明らかに間違っています。私自身の研究は有望な何かを生み出していません。私が集めた唯一のことは、私のモジュールが?loadpathに乗っていないことです。私は何を変更するのかわからないので、ロードパスにある。

誰かが手を貸して、私が読んでいるはずのドキュメントの方向を指すことができますか?

ありがとうございます。

+2

ファイルの名前を '.exs'から' .ex'に変更してください。 – Dogbert

+0

ありがとう@Dogbert。それはうまくいった。どんなドキュメンテーションでもこのコンベンションについてどこで読むことができるのか分かりますか?もしそうなら、あなたはそれを私と分かち合うことができますか?また、私はそれを正しいとマークすることができるように、回答を提出してください。再度、感謝します! – John

+1

残念ながら、http://elixir-lang.org/getting-started/modules.html#scripted-modeより優れたものは見つかりませんでした( 'mix'は.exsファイルをコンパイルしません)。 – Dogbert

答えて

1

.exs files are meant for scriptingmixによって編集され、mixが残りのプロジェクトと一緒にコンパイルされます。アプリケーションから定義されたモジュールにアクセスしたい場合は、lib/my_namespace/test_module.exsからlib/my_namespace/test_module.exに名前を変更する必要があります。

+0

スクリプトではなくバイトコードが必要なのはなぜですか? – John

+1

バイトコードにコンパイルされた@Johnモジュールは、Erlangの "Code Path"(「コードパス」[こちら](http://erlang.org/doc/man/code)参照)に配置するだけで、他のコンパイル済みコードまたはスクリプトによって自動的にロードできます。 .html); 'mix'は、現在のパッケージとそのすべての依存関係に対してこれを自動的に行います)。スクリプトはデフォルトでバイトコードにコンパイルされていないので、実行時に評価するか(Codeeval_file')、バイトコードをコンパイルしてコードパスに配置しない限り、他の場所では利用できません。 – Dogbert

+0

ありがとう@dogbert! – John

関連する問題