我目前正在尝试编写一个混合任务,可以在phoenix (v1.3)
项目中自动化Elm应用程序的脚手架。它生成所有要添加的elm文件/ js脚本,正确安装节点和elm模块。我还生成一个elm_view.ex
和elm_controller.ex
,其中包含当前otp_app
的名称,并按正确方式输出文件:
defmodule PipeDream.Web.ElmController do
use PipeDream.Web, :controller
def index(conn, _params) do
render conn, "index.html"
end
end
但是,当我使用mix phx.server
启动服务器时,出现错误:"module PipeDream.Web.ElmController is not available"
。我发现当我转到这些文件并保存它们时,模块会被正确拾取(与elm_view.ex
类似的错误)。
这可能与我如何呈现controller
和view
模板有关吗?模板看起来像这样:
defmodule <%= @app_name %>.Web.ElmController do
use <%= @app_name %>.Web, :controller
def index(conn, _params) do
render conn, "index.html"
end
end
我正在使用EEx.eval_string(template_string, assigns: [app_name: app])
添加应用模块名称,然后使用Mix.Generator.create_file
非常感谢任何帮助或建议!
答案 0 :(得分:0)
由于上面有很多评论,我决定发布一个[hacky but yet working]解决方案作为未来访问者的答案。
当Elixir / Mix尝试缓存/检查依赖项时,会出现某种文件创建时间问题。虽然Steve Pallen提出的大锤解决方案(rm -rf deps && rm -rf _build && mix do deps.get, deps.compile, compile
)应该始终,但可能会有更方便的黑客攻击:在新生成的文件上调用File.touch/2
来强制执行{{1}重新编译它们。
另外,作为旁注,我建议使用Mix.Generator.embed_template/2
来编译和嵌入模板,而不是通用Mix
来明确意图。