2017-01-12 64 views
2

我在lib/內部創建了一個模塊,更具體地說是lib/my_namespace/test_module.exs如何使用Phoenix項目的lib /文件夾中定義的模塊?

這是所有在其內定義:

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

調用菲尼克斯控制器內該模塊的功能test()呈現錯誤。

** (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 scripting並且是而不是編譯爲字節碼mix以及項目的其餘部分。如果您希望能夠從您的應用程序訪問其中定義的模塊,您應該將lib/my_namespace/test_module.exs重命名爲lib/my_namespace/test_module.ex

+0

爲什麼需要字節碼而不是腳本? – John

+1

@John模塊被編譯爲字節碼,可以通過將其放置在Erlang的「代碼路徑」(參見「代碼路徑」[here](http://erlang.org/doc/man/code))中由其他編譯代碼或腳本自動加載.html);'mix'爲當前包及其所有依賴項自動執行此操作)。由於腳本默認不會編譯爲字節碼,所以它們在其他地方不可用,除非您在運行時評估它們('Code.eval_file')或以某種方式將它們編譯爲字節碼並將其放置在代碼路徑中。 – Dogbert

+0

謝謝@dogbert! – John

相關問題