2

我正在构建一个包含实时数据的小型 Web 应用程序。数据由 Erlang 使用 Cowboy 提供。为简单起见,我希望 Cowboy 也为网页提供静态文件。但似乎 Cowboy 无法识别磁盘上的文件是否已更改,继续为旧版本提供服务。

我尝试禁用 etags 并清除浏览器的缓存,但没有成功。到目前为止,只有重新启动整个 Erlang 应用程序才能工作,这非常乏味(至少在开发过程中)。有什么方法可以禁用 Cowboy 的缓存机制或让它知道文件更改吗?

牛仔设置代码:

start(_StartType, _StartArgs) ->
    % setup cowboy
    Dispatch = cowboy_router:compile([{'_',
                                       [{"/", cowboy_static, {priv_file, app_name, "static/index.html"}},
                                        {"/[...]", cowboy_static, {priv_dir, app_name, "static"}}]}]),
    {ok, _} = cowboy:start_http(http_listener, 5, [{port, 12345}], [{env, [{dispatch, Dispatch}]}]),
    sup:start_link().

附带说明一下,具有讽刺意味的是,Cowboy 会根据文件的修改时间和大小仔细生成 etag,但是当请求更改的文件时,它只会回复旧的 etag 而不是检查更改。

最好的问候,克隆乔

4

1 回答 1

1

事实证明,relx 在构建版本时复制了 priv_dir,在我继续编辑源文件时提供副本(当 html 文件中的更改无法通过浏览器传递时,Find 非常有用。)

我没有在开发过程中构建和运行版本code:priv_dir/1(类似于 Nikola Skoric在 2011 年在 erlang-questions 邮件列表中分享的内容)并在开发时跳过版本:

start(_StartType, _StartArgs) ->
    % setup cowboy
    Dispatch = cowboy_router:compile([{'_',
                                       [{"/", cowboy_static, {file, util:priv_dir() ++ "/static/index.html"}},
                                        {"/[...]", cowboy_static, {dir, util:priv_dir() ++ "/static"}}]}]),
    {ok, _} = cowboy:start_http(http_listener, 5, [{port, 12345}], [{env, [{dispatch, Dispatch}]}]),
    sup:start_link().

-module(util).

priv_dir() ->
    case code:priv_dir(app_name) of
        {error, bad_name} ->
            {ok, Cwd} = file:get_cwd(),
            Cwd ++ "/" ++ "priv";
        Priv ->
            Priv
    end.
于 2015-05-12T23:01:22.350 回答