在 Elixir 1.12 应用程序中启动 `:pg` 的默认范围的正确方法是什么?

问题描述

在 OTP 24 中移除了 :pg2 模块。它的替代品是 :pg。根据{{​​3}}:

认范围 pg 在配置 kernel(6) 时自动启动。

从基于混合的 Elixir 1.12 应用程序中,配置内核以自动启动:pg 范围的正确方法是什么?到目前为止,我一直在这样做,但它似乎真的让编写没有 start/2 函数的库代码变得不可能:

defmodule MyApp do
  use Application

  def start(_type,_args) do

    # Ew,gross:
    {:ok,_pid} = :pg.start_link()

    children() |> Supervisor.start_link([strategy: :one_for_one,name: __MODULE__])
  end

  def children,do: []
end

解决方法

您可以为该模块编写自己的 child_spec

defmodule MyApp do
  use Application

  def start(_type,_args) do
    Supervisor.start_link(children(),strategy: :one_for_one,name: __MODULE__)
  end

  defp children,do: [pg_spec()]

  defp pg_spec do
    %{
      id: :pg,start: {:pg,:start_link,[]}
    }
  end
end