我想在特定文件夹中递归地编译和加载所有模块。
我知道我可以用 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")
def project
中提供您想要混合的任何目录:elixirc_paths: ["lib", "my/other/path"]
就是这样。
关于Elixir 脚本递归加载文件夹中的所有模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29681310/