![](/img/trans.png)
[英]How to fix “** (Mix) The task ”compile.all“ could not be found” when I run `mix test`
[英]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.tree
、 app.start
和phx.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.