如果我在hello.ex中定义了以下混合任务,则运行正常。
defmodule Mix.Tasks.Hello do
use Mix.Task
def run(_), do: IO.puts "hello"
end
但是在“ hello.exs”类型的文件中似乎无法实现?还是有一种没有“ .ex”扩展名的混音任务。
答案 0 :(得分:1)
我不确定“不进行编译”是什么意思。 Elixir 确实是一种编译语言,如果不进行编译就无法执行任何操作。
除了Elixir文件扩展名
.ex
外,Elixir还支持.exs
个文件用于脚本编写。 Elixir完全相同地对待两个文件,唯一的区别在于意图。.ex
文件用于编译,而.exs
文件用于脚本编写。 执行时,两个扩展都编译并将其模块加载到内存中,尽管只有.ex
个文件以.beam
文件的格式将其字节码写入磁盘。
— https://elixir-lang.org/getting-started/modules-and-functions.html#scripted-mode
mix
是代码的外部应用程序。它需要一个.beam
文件来执行它,或者必须将已编译的脚本加载到其进程存储器中。
因此,从技术上讲,您可能会做些类似的事情
defmodule Mix.Tasks.Hello do
use Mix.Task
def run(_), do: IO.puts "hello"
end
defmodule Mix.Tasks.Wrapper do
use Mix.Task
def run(task) do
Code.compile_file("hello.exs")
Mix.Task.run(Module.concat(task))
end
end
但是为什么?将任务作为.ex
文件怎么办?
此外,您可以借助Code.compile_string/2
来完成类似的任务,以编译任务并将其加载到mix
进程的内存中,但是同样,这也不打算使用。