Caching 牛仔';的静态文件处理程序为旧版本的文件提供服务

Caching 牛仔';的静态文件处理程序为旧版本的文件提供服务,caching,erlang,cowboy,Caching,Erlang,Cowboy,我正在构建一个小的web应用程序,它提供实时数据。数据是使用Cowboy从Erlang提供的。为了简单起见,我希望Cowboy也为web页面提供静态文件。但Cowboy似乎不知道磁盘上的文件是否已更改,继续为旧版本服务 我曾尝试禁用ETag并清除浏览器缓存,但没有成功。到目前为止,只需重新启动整个Erlang应用程序,这非常乏味(至少在开发过程中)。有没有办法禁用Cowboy的缓存机制,或者让它知道文件的更改 牛仔设置代码: start(_StartType, _StartArgs) ->

我正在构建一个小的web应用程序,它提供实时数据。数据是使用Cowboy从Erlang提供的。为了简单起见,我希望Cowboy也为web页面提供静态文件。但Cowboy似乎不知道磁盘上的文件是否已更改,继续为旧版本服务

我曾尝试禁用ETag并清除浏览器缓存,但没有成功。到目前为止,只需重新启动整个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进行回复,而不检查更改


致以最诚挚的问候,clonejo

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

我没有在开发过程中构建和运行发行版,而是包装了
code:priv_dir/1
(类似于Nikola Skoric)并在开发时跳过发行版:

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().

file:get_cwd()可能不是最好的选项,如果要避免这种情况,可以设置一个env变量。
-module(util).

priv_dir() ->
    case code:priv_dir(app_name) of
        {error, bad_name} ->
            {ok, Cwd} = file:get_cwd(),
            Cwd ++ "/" ++ "priv";
        Priv ->
            Priv
    end.