Skogsrå: 불로장생약 배치 간소화

Elixir 프로젝트가 충분하면 구성 파일과 구성 변수를 유지하는 것은 악몽이 됩니다.
  • 설정 변수는 코드에 분산되어 있기 때문에 설정 설정을 잊어버리기 쉽다.
  • OS 환경 변수는 항상 문자열이므로 올바른 유형으로 변환되어야 합니다.
  • 은 필요한 변수를 수동으로 검사해야 합니다.
  • 의 기본값을 설정하는 것은 때때로 좀 번거롭습니다.
  • 은 유형 안전이 없습니다.

  • 이상적인 경우 구성은 다음과 같습니다.
  • 이 기록되었습니다.
  • 은 쉽게 찾을 수 있습니다.
  • 은 읽기 쉽다.
  • 성명성.
  • 한마디로 유지보수가 쉽다.

    문제


    다음 예제를 사용하여 자세히 설명합니다.
    config :myapp,
      hostname: System.get_env("HOSTNAME") || "localhost",
      port: String.to_integer(System.get_env("PORT") || "80")
    
    앞의 코드는 다음과 같습니다.
  • 미기록: hostnameport은 무엇입니까?
  • 은 이해하기 어렵다. 한 줄에 걱정이 너무 많다.
  • 은 찾기 어렵습니다: hostnameport은 어디에서 사용합니까?
  • 비성명성: 우리는 Elixir에게 우리가 원하는 값이 무엇인지 아니라 값을 검색하는 방법을 알려 줍니다.
  • 결론: 유지하기 어렵다.

    구성 모듈 작성


    우리는 간단한 방법을 통해 그 중의 몇 가지 문제를 완화시킬 수 있다.
  • 은 설정을 위한 모듈을 만듭니다.
  • 은 프로그램이 가지고 있는 모든 설정 매개 변수에 함수를 만듭니다.
  • 다음 내용은 다소 지루하지만 이전 구성과 비슷합니다.
    defmodule Myapp.Config do
      @moduledoc "My app config."
    
      @doc "My hostname"
      def hostname do
        System.get_env("HOSTNAME") || "localhost"
      end
    
      @doc "My port"
      def port do
        String.to_integer(System.get_env("PORT") || "80")
      end
    end
    
    우리의 원본 코드와 달리 이 코드는 다음과 같습니다.
  • 기록: 함수마다 @doc 속성이 있습니다.
  • 은 쉽게 찾을 수 있습니다. 이 모듈에 정의된 함수에 대한 호출만 찾으면 됩니다.
  • 그러나 우리는 여전히 이전과 기본적으로 같은 코드를 가지고 있다. 즉,
  • 난독.
  • 비성명성.
  • 틀림없이 더 좋은 방법이 있을 거야!

    더 좋은 방법이 있어요. - Skogsr를 알아요.


    Skogsrå은 구성 변수를 쉽게 불러올 수 있는 라이브러리입니다.
  • 변수 기본값입니다.
  • 값의 자동 형식 변환
  • 은 자동으로 문서와 규범을 생성합니다.
  • 운영체제 환경 템플릿 생성.
  • 실행 시 다시 로드합니다.
  • 실행 시 변수의 값을 설정합니다.
  • :persistent_term을 임시 저장소로 사용하여 빠른 캐시 값 접근을 합니다.
  • 은 Elixir 버전의 YAML 구성 공급자에 사용됩니다.
  • 앞의 예는 다음과 같이 다시 쓸 수 있습니다.
    defmodule Myapp.Config do
      @moduledoc "My app config."
      use Skogsra
    
      @envdoc "My hostname"
      app_env :hostname, :myapp, :hostname,
        default: "localhost",
        os_env: "HOSTNAME"
    
      @envdoc "My port"
      app_env :port, :myapp, :port,
        default: 80,
        os_env: "PORT"
    end
    
    이 모듈에는 다음과 같은 기능이 있습니다.
  • Myapp.Config.hostname/0은 호스트 이름을 검색하는 데 사용됩니다.
  • Myapp.Config.port/0은 포트 검색에 사용됩니다.
  • 이 구현을 통해 다음과 같은 이점을 얻을 수 있습니다.
  • 기록된 설정 변수: @envdoc 모듈 속성을 통해.
  • 은 쉽게 찾을 수 있습니다. 각 설정 변수는 Myapp.Config 모듈에 있습니다.
  • 읽기 쉬움: app_env 옵션은 말하지 않아도 알 수 있습니다.
  • 성명성: 우리는 스콧 그레이스에게 우리가 무엇을 원하는지 알려주고 있습니다.

  • 보상: 유형 안전(Strong typing절 참조).

  • 작업 원리

    Myapp.Config.port()을 호출하면 다음과 같은 순서로 포트 값을 검색합니다.
    운영 체제 환경 변수 $PORT
  • 입니다.

  • 구성 파일(예: 테스트 구성 파일)에서 다음을 볼 수 있습니다.
    # file config/test.exs
    use Mix.Config
    
    config :myapp,
      port: 4000
    
  • 기본값이 있으면
  • (이 예에서는 정수 80) 를 반환합니다.
  • type 옵션을 제공하지 않는 한 (Explicit type casting 절 참조) 이 값은 기본값의 유형으로 변환됩니다.
    비록 Skogsrå는 many options and features개가 있지만, 우리는 내가 가장 많이 사용하는 것만 탐색할 것이다.

  • Explicit type casting .

  • Defining custom types .

  • Required variables .

  • Strong typing .
  • 명시적 유형 변환


    유형이 any, binary, integer, float, boolean 또는 atom이 아닌 경우 Skogsrå는 기본값의 유형에 따라 자동으로 값을 변환할 수 없습니다.그런 다음 옵션 type을 사용하여 유형을 명시적으로 지정해야 합니다.사용 가능한 유형은 다음과 같습니다.
  • :any(기본값).
  • :binary .
  • :integer .
  • :float .
  • :boolean .
  • :atom .
  • :module: 시스템에 로드되는 모듈입니다.
  • :unsafe_module: 시스템에서 로드되거나 로드되지 않을 수 있는 모듈입니다.
  • Skogsra.Type 구현: 사용자 정의 형식을 정의하는 데 사용되는 behaviour.
  • 사용자 정의 유형 정의

    HISTOGRAM_BUCKETS이라는 OS 환경 변수를 정수 목록으로 읽어야 한다고 가정합니다.
    export HISTOGRAM_BUCKETS="1, 10, 30, 60"
    
    그리고 우리는 Skogsra.Type 동작을 실현하여 문자열을 정확하게 해석할 수 있다.
    defmodule Myapp.Type.IntegerList do
      use Skogsra.Type
    
      @impl Skogsra.Type
      def cast(value)
    
      def cast(value) when is_binary(value) do
        list =
          value
          |> String.split(~r/,/)
          |> Stream.map(&String.trim/1)
          |> Enum.map(String.to_integer/1)
        {:ok, list}
      end
    
      def cast(value) when is_list(value) do
        if Enum.all?(value, &is_integer/1), do: {:ok, value}, else: :error
      end
    
      def cast(_) do
        :error
      end
    end
    
    마지막으로 Skogsr 구성에서 Myapp.Type.IntegerList을 사용합니다.
    defmodule Myapp.Config do
      use Skogsra
    
      @envdoc "Histogram buckets"
      app_env :buckets, :myapp, :histogram_buckets,
        type: Myapp.Type.IntegerList,
        os_env: "HISTOGRAM_BUCKETS"
    end
    
    그리고 OS 환경 변수에서 buckets을 검색하는 것은 매우 쉬울 것입니다.
    iex(1)> System.get_env("HISTOGRAM_BUCKETS")
    "1, 10, 30, 60"
    iex(2)> Myapp.Config.buckets()
    {:ok, [1, 10, 30, 60]}
    
    또는 변수가 정의되지 않은 경우 응용 프로그램에서 구성합니다.
    iex(1)> System.app_env(:myapp, :histogram_buckets)
    [1, 10, 30, 60]
    iex(2)> Myapp.Config.buckets()
    {:ok, [1, 10, 30, 60]}
    

    필수 변수


    Skogsr는 변수를 강제로 구성하는 옵션을 제공합니다.이 기능은 변수와 Skogsr에 기본값이 없을 때 유용합니다. OS 환경 변수나 응용 프로그램 구성에서 다음 구성 모듈과 같은 값을 찾을 수 있습니다.
    defmodule MyApp.Config do
      use Skogsra
    
      @envdoc "Server port."
      app_env :port, :myapp, :port,
        os_env: "PORT",
        required: true
    end
    
    Myapp.Config.port()이 정의되지 않은 경우
    애플리케이션 구성을 찾을 수 없습니다.
    iex(1)> System.get_env("PORT")
    nil
    iex(2)> Application.get_env(:myapp, :port)
    nil
    iex(3)> MyApp.Config.port()
    {:error, "Variable port in app myapp is undefined"}
    

    강한 유형


    모든 구성 변수에는 다음과 같은 정의와 같은 올바른 함수 PORT 정의가 있습니다.
    defmodule Myapp.Config do
      use Skogsra
    
      @envdoc "PostgreSQL hostname"
      app_env :db_port, :myapp, [:postgres, :port],
        default: 5432
    end
    
    생성된 함수 @spec에는 다음과 같은 Myapp.Config.db_port/0이 있습니다.
    @spec db_port() :: {:ok, integer()} | {:error, binary()}
    
    유형 파생:
  • @spec 값 (이 예는 정수 default)
  • 5432 설정값(이전의 Explicit type casting 부분 참조).
  • 결론


    Skogsra은 유형이 안전하고 조직적인 방식으로 Elixir 응용 프로그램 설정을 처리하는 간단한 방법을 제공합니다.대형 프로젝트는 당연히 그 중에서 이익을 얻을 수 있다.
    네가 이 문장이 유용하다고 생각하길 바란다.즐거운 인코딩!

    본문도 여기서 찾을 수 있습니다: https://thebroken.link/skogsra-simplifying-your-elixir-configuration/.
    커버 이미지 Lukasz Szmigiel 제공

    좋은 웹페이지 즐겨찾기