Elixir脚本递归加载文件夹中的所有模块

Krz*_*nde 10 elixir

我想在特定文件夹中递归地编译和加载所有模块.我知道我可以用Mix项目做到这一点

iex -S mix run
Run Code Online (Sandbox Code Playgroud)

这将加载lib/目录中的所有文件.

但是,我想在非混合脚本中使用相同的行为 - 如果可能的话,编程方式.有什么像这样的Code.compile_all("directory/")
API吗?

Jos*_*lim 33

只是为了澄清术语:Mix不加载lib /中的文件,如果需要它会编译它们,然后使用编译的字节代码(不必再次执行整个文件).

你可以通过调用加载一个目录中的任何文件Code.require_file/1Code.load_file/1但这并不产生任何磁盘神器.如果稍后调用Code.require_file/1,将再次评估相同的文件,这可能需要一些时间.编译的想法完全是你每次都不付这个价格.

那就是说,让我们直接回答你的问题.

  1. 加载目录中的所有内容的方法是:

    dir
    |> Path.join("**/*.exs")
    |> Path.wildcard()
    |> Enum.map(&Code.require_file/1)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果要编译它们,请使用:

    dir
    |> Path.join("**/*.ex")
    |> Path.wildcard()
    |> Kernel.ParallelCompiler.files_to_path("path/for/beam/files")
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果你想在项目的上下文中编译另一个目录(使用mix.exs,那么你可以),你可以给你想要混合的任何目录def project:

    elixirc_paths: ["lib", "my/other/path"]
    
    Run Code Online (Sandbox Code Playgroud)

而已.