Elixir 如何在exs文件中定义一个混合任务,并且仍然运行它?
如果我在hello.ex中定义了下面这样的混合任务,那么它可以正常运行Elixir 如何在exs文件中定义一个混合任务,并且仍然运行它?,elixir,phoenix,Elixir,Phoenix,如果我在hello.ex中定义了下面这样的混合任务,那么它可以正常运行 defmodule Mix.Tasks.Hello do use Mix.Task def run(_), do: IO.puts "hello" end 但这在“hello.exs”类型的文件中似乎不可能?或者有没有一种方法可以在没有“.ex”扩展名的情况下执行混合任务。我不知道“没有编译”是什么意思。Elixir确实是一种编译语言,没有编译它无法执行任何操作 除了Elixir文件扩展名.ex,Elixir还支持
defmodule Mix.Tasks.Hello do
use Mix.Task
def run(_), do: IO.puts "hello"
end
但这在“hello.exs”类型的文件中似乎不可能?或者有没有一种方法可以在没有“.ex”扩展名的情况下执行混合任务。我不知道“没有编译”是什么意思。Elixir确实是一种编译语言,没有编译它无法执行任何操作 除了Elixir文件扩展名
.ex
,Elixir还支持用于脚本编写的.exs
文件。Elixir以完全相同的方式处理这两个文件,唯一的区别在于意图.ex
文件用于编译,而.exs
文件用于编写脚本执行时,两个扩展都编译模块并将其加载到内存中,尽管只有.ex
文件以.beam
文件的格式将字节码写入磁盘。-
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
文件会有什么问题
此外,您还可以通过帮助编译任务并将其加载到
mix
process'内存中来实现类似的功能,但同样,这不是它的使用方式。Edited?…我的意思是“.ex”文件未“编译”。似乎正在发生的一件事是,如果我更改了“.ex”文件中的函数,比如说Hello#Hello_world/1(例如,更改了IO.puts/1的输出),我必须手动重新编译以获得要注册的更改。如果我制作了一个“.exs”脚本,那么这些更改似乎已经注册了。您不应该频繁更改mix
任务:)如果需要具有可配置的行为,请使用参数。此外,如果需要手动重新编译某些内容,则应修复配置(可能在mix.exs
中)。正确配置后,无论发生什么情况,项目都不需要手动重新编译。但是,foo.exs
会重新编译,但是您没有得到.beam
文件,并且更改的字节码存在于您的进程中(iex
或其他任何东西)。mix
,作为一个不同的进程/应用程序,必须自己重新编译脚本,才能将字节码放入内存中。没有什么神奇的。如果我对“.ex”文件中的mix任务函数进行了更改,Elixir不应该在运行“mix hello which task”时接受这些更改并重新编译吗?我必须从本质上删除.beam文件才能让Elixir重新编译。使用上面提到的code.compile\u string/2
,您可能会立即获得当前运行进程中任何内容的字节码,但我怀疑这是编写可维护代码的好方法。