【问题标题】:Custom Mix Task to generate ex files自定义混合任务以生成 ex 文件
【发布时间】:2017-10-16 20:17:23
【问题描述】:

我目前正在尝试编写一个混合任务,以在 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 写入文件

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

【问题讨论】:

  • 所以文件是在磁盘上创建的,但是mix phx.server只有在您在编辑器中手动打开文件并保存它们(不做任何更改)后才会选择它?
  • 是的,没错
  • 你能发布 Mix 任务的来源(你在哪里调用 create_file 等)吗?
  • 我认为文件创建时间可能存在问题。只是出于好奇,您会 File.touch/2 将新创建的文件以 localtime 作为第二个参数吗?另外,我建议你使用Mix.Generator.embed_template/2来编译和嵌入模板。

标签: elixir phoenix-framework elixir-mix


【解决方案1】:

由于上面有很多 cmets,我决定发布一个 [hacky but yet working] 解决方案作为未来访问者的答案。

当 Elixir/Mix 尝试缓存/检查依赖项时,存在某种文件创建时间问题。虽然 Steve Pallen (rm -rf deps &amp;&amp; rm -rf _build &amp;&amp; mix do deps.get, deps.compile, compile) 提出的大锤解决方案应该始终工作,但可能还有更方便的技巧:在新生成的文件上调用 File.touch/2 以强制执行 Mix 重新编译它们。

另外,作为旁注,我建议使用Mix.Generator.embed_template/2 来编译和嵌入模板,而不是通用的EEx.eval_string 以明确意图。

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2019-06-24
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多