Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何在exs文件中定义一个混合任务,并且仍然运行它?_Elixir_Phoenix - Fatal编程技术网

Elixir 如何在exs文件中定义一个混合任务,并且仍然运行它?

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还支持

如果我在hello.ex中定义了下面这样的混合任务,那么它可以正常运行

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
,您可能会立即获得当前运行进程中任何内容的字节码,但我怀疑这是编写可维护代码的好方法。