CEAN安装的Yaws如何启动?
最近被 CEAN 迷住了,能直接安装 Erlang ,省掉了漫长的编译过程。而且,大量 Package 可以随需安装,简直方便得不得了。不过,毕竟不是各个安装包本身。小问题总是有的。这时候,就需要 hack in 了。
一个严重的问题是 CEAN 弄下来的 Yaws 貌似不能正常的启动。忙活了半天,连 Yaws 都用不了,兴奋的输入 yaws:start(). 会返回给你若干错误,伤害劳动人民的感情啊。没关系,稍微进行一下深入的研究,我们就能找到办法。
它的错误提示是:“Cannot find config file”,就是说,找不着配置文件,不是什么大事嘛。哈哈。找到它的配置文件规律,放到那里,不就搞定了么。那么,该文件应该放到哪里呢?既然是从 yaws:start() 开始的,那么,咱们就从这里往下挖:
打开 Yaws 的源代码,从 yaws.erl 开始,其中 yaws.erl:
start() ->
application:start(yaws, permanent).
ok,我们找到 yaws.app 发现:
{mod,{yaws_app,[]}}
也就是说,应该从 yaws_app.erl 开始挖:
start(_Type, _StartArgs) ->
yaws_sup:start_link().
哦,原来是虚晃一枪,在 yaws_sup.erl 中,总算找到貌似有点象的:
YawsServArgs = [get_app_args()],
看来就是它了,咱继续挖:
Conf = case application:get_env(yaws, conf) of
undefined ->
find_c(AS);
{ok, File} ->
{file, File}
end,
靠,这就返回了?浪费喜悦的表情啊,下面干了啥了:
YawsServ = {yaws_server, {yaws_server, start_link, YawsServArgs},
permanent, 5000, worker, [yaws_server]},
瞧这意思,估计还是要到 yaws_server.erl 中挖,于是发现:
Config = (catch yaws_config:load(Env)),
又引入了 yaws_config.erl ,复杂啊,快没耐心了,无论如何咱还是去看看:
load(E = #env{conf = false}) ->
case yaws:first(fun(F) -> yaws:exists(F) end, paths()) of
false ->
{error, “Can’t find no config file “};
{ok, _, File} ->
load(E#env{conf = {file, File}})
end;
Bingo! 看来就是这里了!
分析下:这个 yaws:first 的高阶函数是要判断 paths() 返回值中,第一个 exists 的文件。顾名思义,这个 paths() 就是那一串路径了。即所谓的配置文件搜索路径。那么我们看看它到底搞什么鬼。
嘿嘿,Erlang的交互环境这时候就派上用场了嘛,在 ErlangConsole 下我直接输入:
yaws_config:path().
得到:
["false/yaws.conf","./yaws.conf","/usr/local/etc/yaws.conf"]
咦?怎么还有一个 false ?再看看,原来:
paths() ->
case yaws:getuid() of
{ok, “0″} -> %% root
[yaws_generated:etcdir() ++ "/yaws.conf"];
_ -> %% developer
[filename:join([os:getenv("HOME"), "yaws.conf"]),
“./yaws.conf”,
yaws_generated:etcdir() ++ “/yaws.conf”]
end.
说得真明白,如果我是 root 它就到 etc 目录去找,如果我不是 root 它就到 “HOME”,“.”以及 etc 目录去找 yaws.conf 文件。 而,在 windows cmd 下打 set 检查一下,发现我根本就没有设置 HOME 环境变量嘛。这就简单了。
打开 start.bat 加上这么一行:
set HOME=C:\home
ok,再整个 yaws.conf 放到里面,配配好目录。再打 yaws:start(). 总算看到了久违的提示信息:
1> yaws:start().
=INFO REPORT==== 13-Apr-2007::16:16:03 ===
Yaws: Using config file c:/home/yaws.conf=INFO REPORT==== 13-Apr-2007::16:16:04 ===
Yaws: Listening to 0.0.0.0:8088 for servers
- http://MERLIN:8088 under c:/home/httpdocs
ok
嘿嘿。基本搞定!Enjoy!
不过 Linux 平台下这么干还是不行的。怎么解决呢?且听下回分解。 ![]()


Comments
erlang好东西。
yaws_config:path(). 应为 yaws_config:paths().
Write a Comment