自定义混合任务以生成ex文件

时间:2017-05-17 11:31:48

标签: elixir phoenix-framework mix

我目前正在尝试编写一个混合任务,可以在phoenix (v1.3)项目中自动化Elm应用程序的脚手架。它生成所有要添加的elm文件/ js脚本,正确安装节点和elm模块。我还生成一个elm_view.exelm_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类似的错误)。

这可能与我如何呈现controllerview模板有关吗?模板看起来像这样:

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

编写文件

非常感谢任何帮助或建议!

1 个答案:

答案 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来明确意图。