如何使用elixir自定义任务启动持久cowboy服务器
我正在尝试使用cowboy和plug在elixir中构建一个非常简单的Http服务器。如果我运行如何使用elixir自定义任务启动持久cowboy服务器,elixir,Elixir,我正在尝试使用cowboy和plug在elixir中构建一个非常简单的Http服务器。如果我运行iex-S mix并且只要打开iex,它就可以正常工作。所以我决定创建一个自定义任务,它启动服务器,但立即结束。我怎样才能使它持久?随此问题附上我的任务、应用程序和端点文件。我将非常感谢任何解决方案 server.ex在lib/mix/tasks/server.ex中 lib/MinimalServer/endpoint.ex中的endpoint.ex mix minimal_server.serve
iex-S mix
并且只要打开iex,它就可以正常工作。所以我决定创建一个自定义任务,它启动服务器,但立即结束。我怎样才能使它持久?随此问题附上我的任务、应用程序和端点文件。我将非常感谢任何解决方案
server.ex在lib/mix/tasks/server.ex中
lib/MinimalServer/endpoint.ex中的endpoint.ex
mix minimal_server.server
仅显示14:27:08.515[info]在启动服务器时http://localhost:4000/
然后我看到终端光标再次闪烁,我可以键入任何内容。这里不需要自定义的混合任务。您所需要的一切都已由task提供。使用
mix-run——无暂停
这也解决了我的问题,但我找到了另一个解决方法,如果有人想手动执行defp run\u args do if iex_running?(),do:[],else:[“--no halt”]end
defp iex_running?执行代码。确保加载了(IEx)和IEx.started?()结束
这是phx.server执行此操作的方式,因为它需要大量初始化才能执行。在您的情况下,mix-run--no-halt
正是您所需要的。
defmodule Mix.Tasks.MinimalServer.Server do
use Mix.Task
def run(_) do
MinimalServer.Application.start("","")
end
end
defmodule MinimalServer.Endpoint do
use Plug.Router
use Plug.Debugger
use Plug.ErrorHandler
alias MinimalServer.Router
alias Plug.{HTML, Cowboy}
require Logger
plug(Plug.Logger, log: :debug)
plug(:match)
plug(Plug.Parsers,
parsers: [:json],
pass: ["application/json"],
json_decoder: Poison
)
plug(:dispatch)
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]}
}
end
def start_link(_opts) do
with {:ok, [port: port] = config} <- config() do
Logger.info("Starting server at http://localhost:#{port}/")
Cowboy.http(__MODULE__, [], config)
end
end
forward("/bot", to: Router)
match _ do
conn
|> put_resp_header("location", redirect_url())
|> put_resp_content_type("text/html")
|> send_resp(302, redirect_body())
end
defp redirect_body do
~S(<html><body>You are being <a href=")
|> Kernel.<>(HTML.html_escape(redirect_url()))
|> Kernel.<>(~S(">redirected</a>.</body></html>))
end
defp config, do: Application.fetch_env(:minimal_server, __MODULE__)
defp redirect_url, do: Application.get_env(:minimal_server, :redirect_url)
def handle_errors(%{status: status} = conn, %{kind: _kind, reason: _reason, stack: _stack}),
do: send_resp(conn, status, "Something went wrong")
end
defmodule MinimalServer.Application do
use Application
alias MinimalServer.Endpoint
def start(_type, _args),
do: Supervisor.start_link(children(), opts())
defp children do
[
Endpoint
]
end
defp opts do
[
strategy: :one_for_one,
name: MinimalServer.Supervisor
]
end
end