[Erl_Question06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?
2014-05-20 23:38
309 查看
问题描述:
我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下:
cd(FileDir). c(FileName).
每次都为一个小功能设置FileDir,好烦!
解决方法:
方法1 . 在erlang工作目录【在erl shell中运行pwd()显示的目录】建立一个.erlang文件,输入:
io:format("changing work path~n"). cd(“你建立测试工作目录”). io:format(“change path successfully!~n").
看到successfully表明ok了,原理:erlang shell启动时会首先找当前目录下的.erlang执行的,所以让它启动时都自动cd到测试目录。
方法2. 由于前一种方法,只能设置一个测试目录且输入的*.beam文件与原文件同一目录下,假如,我们在多个目录下有文件,且想输入的测试文件都在一个统一的文件目录下,怎么办?
就是说:不管FileName在哪里?,打开erl就可以用c(FileName).输出beam也在统一的一个目录下。
Prework: user_default.erl
2.1 编写自己的user_default.erl
-module(user_default). %% API -compile(export_all). %%常用的测试目录:请保证路径正确,注意路径里面是用/ 或\\的 -define(WORK_DIRS,[ "常用的测试代码1路径", "常用的测试代码2路径" ]). -define(INCLUDE_DIRS,[“常用的测试代码头文件”]).% -define(OUT_DIR,"输出统一目录").%%这个目录要已创建好的 cfile(FileName) -> code:add_path(?OUT_DIR), cfile(FileName,?WORK_DIRS). cfile(FileName,[]) -> {erlang:atom_to_list(FileName)++":not find",?WORK_DIRS}; cfile(FileName,[Path|Left]) -> FileDir = Path++erlang:atom_to_list(FileName)++".erl", case file:read_file_info(FileDir) of {ok, _} -> c:cd(Path), IncludeDirs = [begin {i,Dir} end||Dir<- ?INCLUDE_DIRS], case compile:file(FileName,[{outdir,?OUT_DIR},report,verbose]++IncludeDirs) of {ok,T} -> c:l(T),{ok,T}; Err -> Err end; _ -> cfile(FileName,Left) end.
2.2 把user_default.erl编译成beam文件后放在HOME【erlang shell 启动时pwd()的目录下】
%%如果不想重启,运行 code:load_abs("$PATH/user_default"). %%从此你就可以用cfile cfile(FileName).
拓展和收获:
1. 在shell中使用的很多函数最终都会在c.erl里面调用,感兴趣可以看看哦。
2. compile:file里面的option很丰富,有意思的有’P’,’E’….生成的文件把头文件都拓展开了,可以看下,
小坑:虽然可以用{outdir,Dir}指定输出目录,但是不可以指定原文件目录,只能用{i,Dir}指定头文件目录。这就是为什么上面的cfile函数要先cd到目标目录才编译的原因。
3. 内置的c(FileName) 有一个额外的功能:只要成功了,就会用最新的文件替换掉旧的文件,热更新,它是用compile:file/1 和 l/1实现的.
4. code:add_path/1对同一个路径执行多次和一次的效果是一样的,自己会做去重操作。
2014年9月11日 16:02:35 我现在改用Rebar啦,超炫酷哇:https://github.com/rebar/rebar/wiki/Getting-started
相关文章推荐
- 指定Qt编译临时文件生成目录
- 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。
- Eclipse下WEB-INF/classes目录下没生成编译文件文件
- Android6.0编译时out目录下文件无法自动生成问题解决方案
- linux 下怎么编译生成a.out文件?
- weblogic中,如何保留编译jsp生成的中间文件,以及会放在哪个目录?
- 编译内核生成的.map文件信息不够怎么办?
- java文件编译后额外生成的$1.class是怎么一回事
- winform程序在编译时,如何自动将文件生成到debug目录下?
- (6)2.4之前的字符驱动-用devfs_register自动生成设备文件(可能在2.6linux目录树下编译不了)
- eclipse 项目中的java文件没有在WEB-INF目录下的classes中 生成相对应的编译后的类
- 预编译加速编译(precompiled_header),指定临时文件生成目录,使项目文件夹更干净(MOC_DIR,RCC_DIR, UI_DIR, OBJECTS_DIR),#pragma execution_character_set("UTF-8")"这个命令是在编译时产生作用的,而不是运行时
- 指定Qt编译临时文件生成目录
- QT Creator 2.0编译会将可执行文件生成到一个类似projectname_build-desktop的目录中,解决办法
- 设置tomcat将jsp编译后的servlet文件的放置目录
- 编译多路径/目录源代码并生成多个可执行文件的makefile实例
- 学习使用AutoMake1.9的自动生成工程文件(二)——flat型程序编译实践过程