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

标签 elixir

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

iex -S mix run

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

但是,我希望在非 Mix 脚本中具有相同的行为 - 如果可能的话,以编程方式。
Code.compile_all("directory/")有没有这样的API?

最佳答案

只是为了澄清条款:Mix 不会加载 lib/中的文件,它会在需要时编译它们,然后使用编译后的字节码(无需再次执行整个文件)。

您可以通过调用 Code.require_file/1 加载目录中的任何文件或 Code.load_file/1但这不会在磁盘中生成任何工件。如果稍后您调用 Code.require_file/1 ,将再次评估相同的文件,这可能需要一些时间。编译的想法正是这样你就不必每次都付出这个代价。

话虽如此,让我们直接回答您的问题。

  • 将所有内容加载到目录中的一种方法是:
    dir
    |> Path.join("**/*.exs")
    |> Path.wildcard()
    |> Enum.map(&Code.require_file/1)
    
  • 如果要编译它们,请使用:
    dir
    |> Path.join("**/*.ex")
    |> Path.wildcard()
    |> Kernel.ParallelCompiler.files_to_path("path/for/beam/files")
    
  • 如果您只想在项目的上下文中编译另一个目录(使用 mix.exs 等等),您可以在 def project 中提供您想要混合的任何目录:
    elixirc_paths: ["lib", "my/other/path"]
    

  • 就是这样。

    关于Elixir 脚本递归加载文件夹中的所有模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29681310/

    相关文章:

    elixir - Phoenix 错误 : module not loaded/not available

    elixir - 惯用的 Elixir 获取嵌套列表项?

    elixir - 检查 elixir 中字符串的有效性

    elixir - spawn/1 和 spawn/3 的区别

    elixir - 如何通过查询过滤预加载的记录

    elixir - Elixir 映射中相同值键名称的模式匹配快捷方式

    elixir - 使用 Ecto 同时显示常见的和数据库特定的验证错误

    testing - Phoenix 测试套件在运行测试时找不到列

    unicode - 如何将 Unicode 代码点转换为 Unicode 字符串?

    elixir - 您如何为 ueberauth 身份进行单独的注册回调