zoukankan      html  css  js  c++  java
  • [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

    问题描述:

    我们想快速测试一个小功能,第一个反应就是打开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里面调用,感兴趣可以看看哦。

       QQ截图20140520232715

        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

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/erlang_shell.html
Copyright © 2011-2022 走看看