簡體   English   中英

自定義混合任務在運行時不觸發編譯

[英]Custom mix task not triggering compile when run

我有一個自定義混合任務。 它工作得很好,但是,當它像其他混合任務一樣被調用時,它不會觸發編譯。 我可以手動運行編譯,但這非常令人沮喪,因為我幾乎總是忘記這樣做並且必須運行一次或兩次任務才能意識到為什么我沒有看到我的更改。

這是“我的”任務,我錯過了什么?

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

您需要在任務中明確說明要編譯。

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

幾個例子是app.treeapp.startphx.routes

這是因為並非所有混合任務都需要編譯步驟。 例如, mix deps.get在獲取依賴項之前不會編譯項目,否則您可能會有很多關於缺少模塊的錯誤/警告。 所有依賴項都應該手動調用,沒有隱式機制根據mix內置的一些“內部規則”調用任務鏈。

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 本身中解決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM