Skogsrå: 불로장생약 배치 간소화
19440 단어 elixirtutorialconfiguration
이상적인 경우 구성은 다음과 같습니다.
문제
다음 예제를 사용하여 자세히 설명합니다.
config :myapp,
hostname: System.get_env("HOSTNAME") || "localhost",
port: String.to_integer(System.get_env("PORT") || "80")
앞의 코드는 다음과 같습니다.hostname
과 port
은 무엇입니까?hostname
과 port
은 어디에서 사용합니까?구성 모듈 작성
우리는 간단한 방법을 통해 그 중의 몇 가지 문제를 완화시킬 수 있다.
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
을 임시 저장소로 사용하여 빠른 캐시 값 접근을 합니다.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 제공
Reference
이 문제에 관하여(Skogsrå: 불로장생약 배치 간소화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/alexdesousa/skogsra-simplifying-your-elixir-configuration-35im텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)