0

背景

我正在尝试使用 Phoenix LiveView 创建桌面应用程序。现在,以某种用户友好的方式(至少我知道的唯一方式)执行此操作的唯一方法是启动我的 Phoenix 应用程序/服务器,然后在客户端机器中打开浏览器窗口。

这就是诀窍。在客户端机器上打开浏览器窗口。

代码

通过查看其他强大的 Elixir 程序员的一些 github 存储库,我能够获取一段可以完成这项工作的代码。

演示/lib/demo/application.ex

defmodule Demo.Application do
  @moduledoc false

  use Application

  def start(_type, _args) do
    children = [
      DemoWeb.Telemetry,
      {Phoenix.PubSub, name: Demo.PubSub},
      DemoWeb.Endpoint
    ]

    opts = [strategy: :one_for_one, name: Demo.Supervisor]
    result = Supervisor.start_link(children, opts)

    start_browser_command =
      case :os.type do
        {:win32, _} ->
          "start"
        {:unix, :darwin} ->
          "open"
        {:unix, _} ->
          "xdg-open"
      end

    if System.find_executable(start_browser_command) do
      System.cmd(start_browser_command, ["http://localhost:4000"])
    else
      Mix.raise "Command not found: #{start_browser_command}"
    end

    result
  end

  def config_change(changed, _new, removed) do
    DemoWeb.Endpoint.config_change(changed, removed)
    :ok
  end
end

这应该是先启动Phoenix App ,然后再打开窗口。

问题

所以,这段代码让我感觉有点不舒服,具体原因是:我的印象是该start功能应该只用于启动我的凤凰服务器,而不是用于其他任何事情。

但随之而来的问题是:

  • 如果该start功能的工作只是启动应用程序,那么执行其他任务的正确/最佳位置是什么,例如打开浏览器的窗口或在应用程序启动执行一些准备工作?
4

1 回答 1

1

通常,我们Application.start_phase/3正是为此目的使用发明的。

如果您想异步运行它,只需生成另一个受监督GenServer的,它会在完成工作后从那里优雅地handle_continue/2实施。{:stop, :normal, _}

于 2021-02-01T14:45:48.170 回答