您如何在exs文件中定义混合任务,并且仍然以相同的方式运行它?

时间:2019-08-27 00:13:27

标签: elixir phoenix

如果我在hello.ex中定义了以下混合任务,则运行正常。

defmodule Mix.Tasks.Hello do
  use Mix.Task
  def run(_), do: IO.puts "hello"
end

但是在“ hello.exs”类型的文件中似乎无法实现?还是有一种没有“ .ex”扩展名的混音任务。

1 个答案:

答案 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进程的内存中,但是同样,这也不打算使用。