我想在特定文件夹中递归地编译和加载所有模块.我知道我可以用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/1或Code.load_file/1但这并不产生任何磁盘神器.如果稍后调用Code.require_file/1,将再次评估相同的文件,这可能需要一些时间.编译的想法完全是你每次都不付这个价格.
那就是说,让我们直接回答你的问题.
加载目录中的所有内容的方法是:
dir
|> Path.join("**/*.exs")
|> Path.wildcard()
|> Enum.map(&Code.require_file/1)
Run Code Online (Sandbox Code Playgroud)如果要编译它们,请使用:
dir
|> Path.join("**/*.ex")
|> Path.wildcard()
|> Kernel.ParallelCompiler.files_to_path("path/for/beam/files")
Run Code Online (Sandbox Code Playgroud)如果你想在项目的上下文中编译另一个目录(使用mix.exs,那么你可以),你可以给你想要混合的任何目录def project:
elixirc_paths: ["lib", "my/other/path"]
Run Code Online (Sandbox Code Playgroud)而已.
| 归档时间: |
|
| 查看次数: |
3368 次 |
| 最近记录: |