Linux 애플리케이션에서는 "나만의" 구성 파서를 사용하고 싶지 않고 이미 사용 가능한 구성 파서를 사용하고 싶습니다(그래야 할까요?). 단순하며 애플리케이션 구성의 유지 관리를 단순하게 유지하고 추가 라이브러리를 추가하지 않습니다.
답변1
실제로 "표준" 구성 파서 라이브러리는 없습니다. 주의 깊게 읽으면 /etc
다음과 같은 조합을 찾을 수 있습니다.
- XML 구성
- Windows INI 스타일 구성
- 기본 KEY=VALUE 구성
- JSON(주로 웹 애플리케이션에서 발견됨).
- YAML(주로 최신 항목, 특히 Python으로 작성된 항목에서 볼 수 있음)
- JSON, YAML 또는 XML처럼 보이지만 그렇지 않은 것(예: Nginx 구성(JSON처럼 보이지만 그렇지 않음), Apache(XML처럼 보이지만 그렇지 않음) 및 Unbound(YAML처럼 보임) 참조) ,하지만).
- 다양한 쉘 언어.
- 쉘 언어처럼 보이지만 기술적으로는 그렇지 않은 모든 종류의 것입니다.
- 다양한 스크립팅 언어에 대한 소스 코드 조각.
- 제가 생각하지 못한 다른 일들이 있을 수도 있습니다.
귀하의 애플리케이션이 무엇을 사용하는지에 관해서는:
- 신성한 모든 것을 사랑하려면 XML을 피하십시오. 불필요하게 장황하고 구문 분석하기가 매우 복잡하며(따라서 시간이 오래 걸리고 메모리도 많이 필요함) 많은 보안 문제가 발생합니다. 요소와 속성 사이의 적절한 균형을 유지하는 것도 중요하며 일반적으로 나중에 어느 시점에서 이에 대한 선택을 후회하게 될 것입니다. 여기서 유일한 장점은 어떤 시스템에서든 작동하는 XML 파서가 거의 보장된다는 것입니다.
- Windows 스타일 INI 파일은 구성 구조의 복잡성을 제한하지만 일반적으로 안전한 선택입니다. 이를 위한 많은 라이브러리가 존재하며 시스템에는 이미 하나 이상의 라이브러리가 있을 것입니다. Linux에서는 그다지 인기가 없지만(클래식 구성 파일은 전통적으로 섹션 헤더가 없는 KEY=VALUE 쌍입니다) 여전히 널리 사용되고 이해하기 쉽습니다.
- 기본 KEY=VALUE 쌍(이상적으로는 한 줄에 하나씩)은 구문 분석이 매우 간단하여 라이브러리가 필요하지 않지만 해당 기능은 매우 제한됩니다.
- JSON은 안전하고 구문 분석하기 쉽고 널리 지원되며(현재 거의 모든 주요 언어에 하나 이상의 구문 분석기가 있음) 구성 구조의 임의 중첩을 지원합니다. 그러나 주석은 지원하지 않습니다(일부 파서는 지원하지만 결과는 상호 운용 가능하지 않음). 이는 텍스트 편집기로 편집하도록 설계된 파일에는 적합하지 않습니다.
- YAML은 제가 개인적으로 가장 좋아하는 것입니다. 상당히 안전하고 구문 분석하기 쉽고, 대부분의 사람들에게 매우 자연스러워 보이며, 주석을 지원하고, 오버헤드가 거의 없습니다. 여기서 중요한 것은 들여쓰기입니다.진짜이는 구문의 약 80%를 차지하며 YAML에 들여쓰기를 위한 공백(탭 없음)이 필요하다는 사실과 결합하여 좋은 편집기가 없으면 사용하기가 약간 번거로울 수 있기 때문에 중요합니다.
- 스크립팅 언어를 사용하는 경우 구성을 위해 소스 코드 조각을 사용하는 것을 고려할 수 있지만매우주의해서 수행하십시오. 매우 신중하게 구문 분석하지 않으면 사용자가 내부 논리에 대해 원하는 거의 모든 작업을 수행하도록 허용할 수 있습니다. 이는 고객 지원에 있어서 악몽입니다.~ 할 것이다결국 사람들은 당신이 변경한 핵심 프로그램 내부에 무언가를 포함하는 구성을 깨뜨렸다고 불평하게 됩니다.
답변2
하나기준제가 생각하는 구성 파서는 환경 변수 설정을 위한 쉘 코드입니다.
귀하의 소프트웨어가 다음과 같은 프로그램에 의해 실행되는 경우:
#! /bin/sh -
set -o allexport
for conf in /etc/default/mysoft ~/.config/mysoft.conf; do
[ -f "$conf" ] && [ -r "$conf" ] && . "$conf"
done
unset -v conf
exec mysoft "$@"
그런 다음 사용자는 ~/.config/mysoft.conf
다음과 같은 것을 만들 수 있습니다.
MYSOFT_TUNABLE=foo
# even using shell code to set the values:
MYSOFT_MAX_COLUMNS=$((${COLUMNS:-$(tput cols)} / 2))
그리고 이러한 값은 작성된 언어를 mysoft
사용하여 해당 API를 사용하여 쿼리할 수 있습니다 .getenv("MYSOFT_TUNABLE")
이는 flat 으로 제한되지만 key=value
NUL value
이 아닌 문자가 있는 문자열만 가능합니다. 더 복잡한 데이터 구조가 필요한 경우 JSON 또는 XML을 보면 됩니다. 대부분의 언어에는 하나 이상의 구문 분석 라이브러리가 있습니다.
php
perl
해석된 언어(예: , , ... )로 작성된 소프트웨어 의 경우 python
일반적으로 간단하고 매우 유연한 접근 방식은 구성 파일을 이러한 언어의 소스 파일로 작성하는 것입니다.
예를 들어 다음과 같이 perl
만듭니다 ~/.config/mysoft/conf.pl
.
%conf = (
string_param => "string",
list_param => [1, 2],
complex_param => { foo => "bar", bar => "baz" }
);
프로그래밍 방식으로 생성하는 것도 간단합니다.
의 경우 sh
다음을 사용할 수 있습니다 export -p
.
setenv("MYSOFT_TUNABLE", "bar");
system("export -p MYSOFT_TUNABLE MYSOFT_MAX_COLUMS > ~/.conf/mysoft.conf");
또는 다음을 사용하여 perl
:
use Data::Dumper;
print Data::Dumper->Dump([\%conf], ["*conf"]);