주요 질문은 구성 파일을 Python과 같은 Turing 완전한 언어로 만들고 싶 습니까? 그것을 원한다면, Guile 또는 Lua 와 같은 다른 (완전한) 스크립팅 언어를 포함시키는 것을 고려할 수도 있습니다 (Python보다 사용 또는 포함하는 것이 "간단한"것으로 인식 될 수 있기 때문에 확장 및 확장에 대한 장을 읽으십시오) Python 포함 ). ( Amon의 다른 답변 때문에 깊이 논의 했으므로) 더 이상 논의하지는 않지만 응용 프로그램에 스크립팅 언어 를 포함시키는 것이 건축 상의 주요 선택 이므로 매우 일찍 고려해야합니다.; 나는 나중에 그 선택을 권장하지 않습니다!
"스크립트"를 통해 구성 가능한 프로그램의 잘 알려진 예는 GNU emacs 편집기 (또는 독점 영역의 AutoCAD )입니다. 따라서 스크립팅을 수락하면 일부 사용자는 해당 기능을 광범위하게 사용하고 결국 남용 라인 스크립트를 작성한다는 점에 유의하십시오. 따라서 충분한 스크립팅 언어를 선택하는 것이 중요합니다.
그러나 (적어도 POSIX 시스템에서는) 초기화시 구성 "파일"을 동적으로 계산할 수있는 편리한 방법을 고려할 수 있습니다 (물론, 시스템 관리자 나 사용자에게 제정신 구성의 부담을 남겨두고 실제로는 구성입니다) 파일이나 명령에서 나오는 텍스트 ). 이를 위해 a 또는 a 로 시작하는 구성 파일 경로 가 실제로 파이프 라인으로 읽는 쉘 명령 이라는 규칙을 채택 하고 문서화 할 수 있습니다 . 따라서 사용자에게 가장 익숙한 "전 처리기"또는 "스크립트 언어"를 사용할 수 있습니다.!
|
(동적으로 계산 된 구성을 수락하는 경우 보안 문제에 대해 사용자를 신뢰해야합니다)
따라서 초기화 코드에서 main
(예를 들어) 일부 --config
인수를 수락하고 일부 인수confarg
를 가져옵니다 FILE*configf;
. 해당 인수로 시작하는 !
경우 (예 : (confarg[0]=='!')
....) configf = popen(confarg+1, "r");
해당 파이프를 사용 하여 닫습니다 pclose(configf);
. 그렇지 않으면 configf=fopen(confarg, "r");
해당 파일을 사용 하고 닫습니다 fclose(configf);
(오류 확인을 잊지 마십시오). 참조 파이프 (7) , 는 popen (3) , fopen을 (3) . 파이썬으로 코딩 된 응용 프로그램의 경우 os.popen 등에 대해 읽으십시오 .
(이상한 사용자가 위 의 트릭 을 우회 !foo.config
하기 위해 전달 ./!foo.config
하도록 명명 된 구성 파일을 전달하려는 문서 popen
)
BTW, 그러한 트릭은 단지 편리함입니다 (고급 사용자가 구성 파일 을 생성 하기 위해 일부 쉘 스크립트를 코딩하도록 요구하지 않기 위해 ). 사용자가 버그를보고하려면 생성 된 구성 파일을 보내야 합니다.
초기화시 플러그인 을 사용하고로드하는 기능 ( 예 : dlopen (3)) 을 사용하여 응용 프로그램을 설계 할 수도 있습니다 (그리고 해당 플러그인에 대해 사용자를 신뢰해야 함). 다시 말하지만 이것은 매우 중요한 아키텍처 결정입니다 (그리고 이러한 플러그인과 애플리케이션에 대해 다소 안정적인 API 와 규칙 을 정의 하고 제공 해야합니다).
Python과 같은 스크립팅 언어로 코딩 된 애플리케이션의 경우 eval 또는 exec 또는 이와 유사한 프리미티브에 대한 일부 프로그램 인수를 승인 할 수도 있습니다 . 다시 보안 문제는 (고급) 사용자 의 관심사입니다 .
구성 파일의 텍스트 형식에 관한 것은 (그것이 생성 여부를 수), 나는 당신이 주로 필요가 있다고 생각 을 문서화 아니라 (일부 특정 형식의 선택입니다 하지 중요, 나는 수 있도록하는 것이 좋습니다 그러나 사용자가 넣을 수 그 안에 약간의 코멘트가 있습니다). JSON (바람직하게는 //
eol 또는 /*
... 까지 평소와 같이 주석을 수락하고 건너 뛰는 일부 JSON 파서와 함께 */
) 또는 YAML, XML, INI 또는 자신의 것을 사용할 수 있습니다. 구성 파일을 구문 분석하는 것은 상당히 쉽습니다 (해당 작업과 관련된 많은 라이브러리가 있습니다).