码迷,mamicode.com
首页 > 其他好文 > 详细

[Erl_Question06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

时间:2014-05-21 17:58:10      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   java   

问题描述:

我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下:

bubuko.com,布布扣
cd(FileDir).
c(FileName).
bubuko.com,布布扣

每次都为一个小功能设置FileDir,好烦!

解决方法:

方法1 .  在erlang工作目录【在erl shell中运行pwd()显示的目录】建立一个.erlang文件,输入:

bubuko.com,布布扣
io:format("changing work path~n").
cd(“你建立测试工作目录”). 
io:format(“change path successfully!~n").
bubuko.com,布布扣

看到successfully表明ok了,原理:erlang shell启动时会首先找当前目录下的.erlang执行的,所以让它启动时都自动cd到测试目录。

方法2. 由于前一种方法,只能设置一个测试目录且输入的*.beam文件与原文件同一目录下,假如,我们在多个目录下有文件,且想输入的测试文件都在一个统一的文件目录下,怎么办?

就是说:不管FileName在哪里?,打开erl就可以用c(FileName).输出beam也在统一的一个目录下

Prework: user_default.erl

  2.1  编写自己的user_default.erl

bubuko.com,布布扣
-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.
bubuko.com,布布扣

          2.2  把user_default.erl编译成beam文件后放在HOME【erlang shell 启动时pwd()的目录下】

bubuko.com,布布扣
%%如果不想重启,运行
code:load_abs("$PATH/user_default"). 
%%从此你就可以用cfile
cfile(FileName).
bubuko.com,布布扣

拓展和收获:

   1.  在shell中使用的很多函数最终都会在c.erl里面调用,感兴趣可以看看哦。

   bubuko.com,布布扣

    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对同一个路径执行多次和一次的效果是一样的,自己会做去重操作。

[Erl_Question06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?,布布扣,bubuko.com

[Erl_Question06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

标签:style   blog   class   c   code   java   

原文地址:http://www.cnblogs.com/zhongwencool/p/erlang_shell.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!