自定义混合任务在运行时不会触发编译

时间:2019-06-07 16:01:33

标签: elixir mix

我有一个自定义混音任务。它可以完美地工作,但是,当它像其他混合任务一样被调用时,它不会触发编译。我可以手动运行编译程序,但这非常令人沮丧,因为我几乎总是忘记这样做,并且必须在执行一次或两次运行任务之前才意识到为什么看不到自己的更改。

这是“我的”任务,我想念什么?

defmodule Mix.Tasks.Return do
  @moduledoc """
  Task for processing returns
  """
  use Mix.Task
  require Logger
  alias Returns

  @shortdoc "Check for returns and process"

  def run(args) do
    args
    |> get_return_file_name()
    |> Returns.process()
    |> Kernel.inspect()
    |> Logger.info()
  end

  defp get_file_name(nil), do: get_file_name([])
  defp get_file_name([]), do: get_default_file_name()
  defp get_file_name([filename]), do: filename

  defp get_default_file_name() do
    DateTime.utc_now() 
    |> DateTime.to_string()   
    |> String.split(" ")  
    |> List.first()
    |> (fn date -> "default-#{date}.txt" end).()
  end
end

2 个答案:

答案 0 :(得分:3)

您需要在任务中明确说明要编译的内容。

@impl true
def run(args) do
  ...
  Mix.Task.run("compile")
  ...

两个示例是app.treeapp.startphx.routes

这是因为并非所有混合任务都需要编译步骤。例如,mix deps.get在获取依赖项之前不会编译项目,否则您可能会遇到很多有关缺少模块的错误/警告。所有依赖项均应手动调用,没有隐式机制根据mix中内置的某些“内部规则”来调用任务链。

答案 1 :(得分:0)

Mix.Task.run("compile")修复程序可能实际上不起作用。 JoséValim有这个建议:

这是因为如果重新编译它们,则不会在内存中执行新的模块版本。解决方法是您执行此操作:

def run(args) do
  Mix.Task.run("compile")
  __MODULE__.compiled_run(args)
end

def compiled_run(args) do
  ...
end

这将迫使它选择模块的最新版本。尽管这可能是我们应该在Elixir中解决的问题。