Как запустить постоянный ковбойский сервер с помощью настраиваемой задачи elixir - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь построить очень простой Http-сервер в эликсире, используя ковбой и плагин. Он отлично работает, если я запускаю iex -S mix и пока открыт iex. Поэтому я решил создать настраиваемую задачу, которая запускает сервер, но немедленно завершает его. Как сделать настойчивым? Я прикрепляю файл задачи, приложения и конечной точки вместе с этим вопросом. Буду очень благодарен любому решению.

server.ex in lib / mix / tasks / server.ex

defmodule Mix.Tasks.MinimalServer.Server do
   use Mix.Task
   def run(_) do
      MinimalServer.Application.start("","")
   end
end

endpoint.ex в lib / MinimalServer / endpoint.ex

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

application.ex в lib / MinimalServer / application. пример

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

mix minimal_server.server показывает только 14:27:08.515 [info] Starting server at http://localhost:4000/, а затем я вижу, что курсор моего терминала снова мигает, и я могу ввести что угодно.

1 Ответ

1 голос
/ 07 мая 2020

Здесь вам не нужно настраивать задачу mix. Все необходимое уже предоставлено задачей mix run. Используйте

mix run --no-halt
...