erlang 导入库脚本

erlang 导入库时要copy 还要写配置文件,现在写了一个脚本来实现这个功能。
调用
filetest( "/home/yangzm/erl/ej/","/opt/erlang/lib/erlang/lib" ).
会把ebin 及依赖的ebin都 copy到目标,并在~/.erlang 中添加路径。

代码如下:
%///
-module(b).
-author("yangzm").

-compile(export_all).

format(Format, Args)->
  lists:flatten(io_lib:format(Format,Args)).

make_dir_list( Dir )->
   R = filename:split( Dir ),
   R1 = tl( R ),
   Se = lists:seq( 1, length( R )-1 ),

   lists:foreach(
     fun( X )->
       Rt = lists:sublist( R1, X ),
       Rd = string:concat( "/", string:join( Rt, "/") ),

       % 文件夹是否存在
       S = filelib:is_dir( Rd ),
       if
          S =:= false ->
           file:make_dir(Rd);
          true->
            ok
       end
     end,
   Se ),

   ok.

copyDir(FromDir,TarDir)->
  %%获取当前文件夹的所有文件列表(包括子文件夹)
  {ok,AllFile} = file:list_dir_all(FromDir),
  %%创建目标文件夹
  %file:make_dir(TarDir),
  make_dir_list( TarDir ),
  %%尾递归遍历所有文件
  loopCopy(AllFile,FromDir,TarDir).

loopCopy(AllFile,FromDir,TarDir) ->
  case AllFile of
    [] ->
      ok;
    _ ->
      %%每次拿第一个文件  One
      [One|Other]=AllFile,
      Path=FromDir++"/"++One,
      Tar=TarDir++"/"++One,
      %%判断当前文件是否是文件夹
      IsDir= filelib:is_dir(Path),

      %%if写法  所有判断的可能写在前面  true写在后面
      if IsDir =:= false->
        %%如果当前是文件  则拷贝到目标路径
        file:copy(Path, Tar);
      %%if 的默认值
        true->
          %%如果当前是文件夹 在目标路径创建文件夹  并拷贝当前文件夹
          file:make_dir(Tar),
          copyDir(Path,Tar)
      end,

      %%递归第一个文件后面的文件
      loopCopy(Other,FromDir,TarDir)
  end.

copyitems(Source, Target, L3, L4)->
  Out = L3 ++ L4,
  lists:foreach(
    fun(X)->
      error_logger:info_msg("~p~n",[X]),
      IsDir= filelib:is_dir( X ),
      if IsDir =:= true ->
        Tail = filename:basename( Source ),
        Pos = string:rstr( X, Tail ),
        Pos2 = string:len(X) - Pos + 1,
        Ri = string:right( X, Pos2 ),
        copyDir( X, lists:concat([Target,"/", Ri] ) ),
        % 写入配置文件
        {ok,[[Home]]} = init:get_argument(home),
        Sconfig = string:concat( Home, "/.erlang"),
        Con = lists:concat([Target,"/", Ri] ),
        Sr = format( "\ncode:add_pathz(\"~s\").",[Con]),
        case file:open( Sconfig, [read,binary,raw]) of
          {ok,S}->
            Size = filelib:file_size( Sconfig ),
            {ok, Read} = file:pread( S, 0, Size ),
            Sread = format("~s",[Read]),
            file:close(S),
            Swrite = string:concat( Sread, Sr ),
            {ok,W} = file:open(Sconfig,[raw,write,binary]),
            file:pwrite( W, 0, Swrite ),
            file:close(W),
            ok
        end
      end
    end,
    Out).

filetest( Source, Target )->
    {ok,Dir} = file:list_dir_all( Source ),

    Ets = ets:new(abc,[duplicate_bag]),
    case lists:member( "ebin", Dir ) of
      true ->
        St = lists:concat( [Source, "ebin"] ),
        ets:insert(Ets,{St})
    end,

case lists:member( "priv", Dir ) of
  true->
    St2 = lists:concat( [Source, "priv"] ),
    ets:insert(Ets,{St2})
end,

case lists:member( "deps", Dir ) of
  true ->
    St2 = lists:concat( [Source, "deps"] ),

    {ok,Dir2} = file:list_dir_all( St2 ),
    L2 = lists:map( fun( X )-> lists:concat( [X, "/ebin"] ) end, Dir2 ),
    L4 = lists:map( fun( X )-> lists:concat( [St2,"/", X] ) end, L2 ),

    L3 = lists:map( fun( {X} )-> X end, ets:tab2list( Ets ) ),
    copyitems(Source,Target,L3,L4),
    ok;
  false ->
    L3 = lists:map( fun( {X} )-> X end, ets:tab2list( Ets ) ),
    copyitems(Source,Target,L3,[])
  end,

io:format("fdas").

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值