소스 제어에서 구성 파일을 어떻게 처리합니까?


97

일반적인 웹 앱과 파일 구성이 있다고 가정 해 보겠습니다. 프로젝트에서 작업하는 모든 개발자는 개발 상자에 대해 하나의 버전을 갖게되며 개발, 제품 및 단계 버전이 있습니다. 소스 제어에서 이것을 어떻게 처리합니까? 이 파일을 전혀 체크인하지 않거나 다른 이름으로 확인하거나 모두 멋진 일을하십니까?

답변:


70

내가 과거에 한 일은 소스 제어에 체크인되는 기본 구성 파일을 갖는 것입니다. 그런 다음 각 개발자는 소스 제어에서 제외되는 자체 재정의 구성 파일을 갖습니다. 앱은 먼저 기본값을로드 한 다음 재정의 파일이있는 경우이를로드하고 기본 파일보다 우선적으로 재정의의 모든 설정을 사용합니다.

일반적으로 재정의 파일이 작을수록 더 좋지만 매우 비표준 환경의 개발자를 위해 항상 더 많은 설정을 포함 할 수 있습니다.


24

구성 코드이며 버전을 지정해야합니다. 구성 파일은 사용자 이름을 기반으로합니다. UNIX / Mac 및 Windows 모두에서 사용자의 로그인 이름에 액세스 할 수 있으며 이들이 프로젝트에 고유 한 한 괜찮습니다. 환경에서이를 재정의 할 수도 있지만 모든 버전을 제어 해야합니다 .

또한 빌드 및 플랫폼 문제를 진단하는 데 도움이되는 다른 사람의 구성을 검사 할 수 있습니다.


10
구성이 버전 화되어야한다는 점을 강조하기 위해 절대적으로 +1
Alexander Bird

어떤 이유로 사용자 이름이 신뢰할 수없는 경우 재정의 구성 파일의 이름을 제공하는 한 줄만있는 단일 파일을 가질 수 있습니다. 이 방법이 아주 작은 버전 제어되지 않는 (약 10 자 정도에서와 같이). 그리고 README 파일은 그 파일을 만들어야한다고 설명 할 수 있습니다.
Alexander Bird

나는 항상 구성이 코드와 별도로 유지되어야한다고 생각합니다. 나는 하나의 리포지토리에 너무 많은 구성이 필요한 곳에서 일하여 Git이 구성 파일로 압도당했습니다. 구성이 버전 화되어서는 안된다는 말이 아니라 아티팩트 관리자처럼 다른 곳에 속합니다. Config는 코드가 아니라 코드 설정입니다.
Thomas

구성 파일에는 버전을 지정하지 않아야하는 암호와 같은 민감한 정보가 포함될 수 있습니다. 아니면 모든 개발자에게 프로덕션 환경에 대한 액세스 권한을 부여 하시겠습니까? "마스터 구성"을 버전 화하고 특정 환경에서 재정의하는 것이 더 낫다고 생각합니다.
Christophe Weis

19

해당 파일의 버전을 지정하지 마십시오. 템플릿을 버전 화합니다.


2
이 접근 방식을 사용하면 main.php.tmpl 만 있고 새 복사본을 체크 아웃 할 때 main, php에 복사합니다. 실수로 커밋하지 않도록 main.php 파일을 무시 목록에 추가합니다.
levhita

10

우리 팀은 각 환경 (web.config.dev, web.config.test, web.config.prod)에 대해 별도의 구성 파일 버전을 유지합니다. 배포 스크립트는 올바른 버전을 복사하여 이름을 web.config로 바꿉니다. 이렇게하면 각 환경의 구성 파일에 대한 전체 버전 제어가 가능하고 쉽게 diff 등을 수행 할 수 있습니다.


6

현재 다음과 같이 확장명이 추가 된 "템플릿"구성 파일이 있습니다.

web.config.rename

그러나 중요한 변경 사항이 변경된 경우이 방법에 문제가 있음을 알 수 있습니다.


6

템플릿 접근 방식에 +1.

그러나이 질문에는 태그 Git이 있기 때문에 사용자 정의가 비공개 테스트 브랜치에 유지되는 분산 형 대안이 떠 오릅니다.

A---B---C---D---           <- mainline (public)
     \       \
      B'------D'---        <- testing (private)

이 체계에서 메인 라인에는 최소한의 조정이 필요한 일반 "템플릿"구성 파일이 포함되어 있습니다.

이제 개발자 / 테스터는 구성 파일을 마음대로 조정할 수 있으며 이러한 변경 사항은 비공개 테스트 분기 (예 : B '= B + 사용자 지정)에서 로컬로만 커밋 할 수 있습니다. 메인 라인이 발전 할 때마다 쉽게 테스트에 병합하여 D '(= D + B의 사용자 지정 병합 버전)와 같은 병합 커밋이 발생합니다.

이 체계는 "템플릿"구성 파일이 업데이트 될 때 실제로 빛을 발합니다. 양쪽의 변경 사항이 병합되고 호환되지 않는 경우 충돌 (또는 테스트 실패)이 발생할 가능성이 매우 높습니다!


그러나 개발자 테스터가 메인 라인으로 푸시 할 때 템플릿 파일에 대한 변경 사항도 푸시됩니다. 아니?
Nick Zalutskiy 2009

Nick의 의견에 대한 해결책이 없으면 내가 본 것에서는 작동하지 않습니다. 또는 문제를 해결할 수있는 사용중인 흐름 모델을 설명 할 수 있습니다.
Alexander Bird

빌드시 필요한 조정이 적용된 템플릿 접근 방식에 동의합니다. 그러나 분기 주제에 대해 ... 여러 템플릿 (dev, test 등)이 있고 개발자가 커밋에서 변경 사항을 생략하면 어떨까요? 완벽하지는 않지만 협력하여 작업 할 수 있습니다.
NickSuperb 2011 년

5

우리가 사용하는 솔루션은 단일 구성 파일 (web.config / app.config) 만 갖는 것이지만 모든 환경에 대한 설정이 포함 된 파일에 특수 섹션을 추가합니다.

이있는 LOCAL, DEV, 품질 보증, 생산 부분 우리의 config 파일 (들)에 해당 환경에 관련된 구성 키를 포함하는 각.

이 모든 것이 작동하도록 만드는 것은 모든 애플리케이션 (winforms 및 webforms)에서 참조되는 xxx.Environment 라는 어셈블리로 애플리케이션이 작동중인 환경을 알려줍니다.

xxx.Environment 어셈블리 는 주어진 시스템 의 machine.config 에서 DEV, QA 등에 있음을 알려주 는 정보의 한 줄을 읽습니다 .이 항목은 모든 워크 스테이션과 서버에 있습니다.

도움이 되었기를 바랍니다.


1
몇 환경 (예 : 연결 문자열) 사이에 차이가있는 경우이 아니라 매우 작동
에릭 Labashosky

100 명의 개발자가 모두 자신의 맞춤 설정을 여기에 적용하지 않는다고 가정하면 (아직 작동하지만 매우 번거 롭습니다)
Alexander Bird

5

나는 항상 web.config 파일과 동일한 폴더에 소스 제어의 모든 버전의 구성 파일을 보관했습니다.

예를 들면

web.config
web.qa.config
web.staging.config
web.production.config

web.config.production 또는 production.web.config와는 반대로이 명명 규칙을 선호합니다.

  • 파일 이름으로 정렬 할 때 파일을 함께 유지합니다.
  • 파일 확장자별로 정렬 할 때 파일을 함께 유지합니다.
  • 파일이 실수로 프로덕션으로 푸시되면 IIS가 * .config 파일이 제공되는 것을 방지하기 때문에 http를 통해 콘텐츠를 볼 수 없습니다.

기본 구성 파일은 자체 시스템에서 로컬로 애플리케이션을 실행할 수 있도록 구성되어야합니다.

가장 중요한 것은 이러한 파일이 서식을 포함하여 모든 측면에서 거의 100 % 동일해야한다는 것입니다. 한 버전에서는 탭을 사용하고 들여 쓰기를 위해 다른 버전에서는 공백을 사용하면 안됩니다. 파일 간의 차이점을 정확히 확인하려면 파일에 대해 diff 도구를 실행할 수 있어야합니다. 파일 비교를 위해 WinMerge를 사용하는 것을 선호합니다.

빌드 프로세스에서 바이너리를 만들 때 해당 환경에 적합한 구성 파일로 web.config를 덮어 쓰는 작업이 있어야합니다. 파일이 압축 된 경우 해당 빌드에서 관련없는 파일을 삭제해야합니다.


4

나는 이전에 web.dev.config, web.prod.config 등과 같은 템플릿을 사용했지만 이제는 '파일 덮어 쓰기'기술을 선호합니다. web.config 파일에는 대부분의 설정이 포함되어 있지만 외부 파일에는 db 연결과 같은 환경 별 값이 포함되어 있습니다. Paul Wilson의 블로그 에 대한 좋은 설명입니다 .

새 값 / 속성을 추가 할 때 고통을 유발할 수있는 구성 파일 간의 중복 양을 줄입니다.


3

@Grant가 맞습니다.

저는 100 명에 가까운 다른 개발자가있는 팀에 속해 있으며 구성 파일이 소스 제어에 체크인되지 않았습니다. 체크 아웃 할 때마다 가져 오는 파일 버전이 저장소에 있지만 변경되지는 않습니다.

그것은 우리를 위해 꽤 잘 해결되었습니다.


2

나는 버전을 제어하지만 다른 서버로 푸시하지 않습니다. 프로덕션 서버에 변경이 필요한 경우 구성 파일을 직접 변경합니다.

예쁘지 않을 수도 있지만 잘 작동합니다.


2

app / web.config의 체크인 된 일반 바닐라 버전은 모든 개발자 컴퓨터에서 작동하기에 충분히 일반적이어야하며 새로운 설정 변경 등으로 최신 상태로 유지되어야합니다. 개발자에 대한 특정 설정 집합이 필요한 경우 / test / production 설정, GateKiller가 말했듯이 이러한 설정을 사용하여 별도의 파일을 체크인하십시오. 파일 확장자를 변경하지 않기 위해 일반적으로 "web.prod.config"를 사용하지만 일종의 명명 규칙을 사용합니다.


2

버전 제어에 체크인 된 템플릿 구성 파일을 사용하고 자동화 된 빌드의 단계를 사용하여 템플릿 파일의 특정 항목을 환경 별 설정으로 바꿉니다. 환경 별 설정은 버전 제어를받는 별도의 XML 파일에 저장됩니다.

우리는 자동화 된 빌드에서 MSBuild를 사용하고 있으므로 MSBuild 커뮤니티 작업 의 XmlUpdate 작업 을 사용하여 값을 업데이트합니다.


2

오랫동안 저는 bcwood가했던 일을 정확히 해왔습니다. web.dev.config, web.test.config, web.prod.config 등의 복사본을 소스 제어하에 보관 한 다음 빌드 / 배포 시스템이 다양한 환경에 배포 할 때 자동으로 이름을 바꿉니다. 파일 사이에 일정량의 중복이 발생하지만 (특히 모든 asp.net 항목에서) 일반적으로 잘 작동합니다. 또한 팀의 모든 구성원이 변경 사항을 적용 할 때 모든 파일 을 업데이트 해야 함을 기억해야 합니다.

그건 그렇고, 파일 연결이 끊어지지 않도록 끝에 ".config"를 확장자로 유지하는 것을 좋아합니다.

구성 파일의 로컬 개발자 버전에 관해서는 항상 사람들이 가능한 한 동일한 로컬 설정을 사용하여 자신의 버전을 가질 필요가 없도록 최선을 다합니다. 항상 모든 사람에게 작동하는 것은 아닙니다.이 경우 사람들은 일반적으로 필요에 따라 로컬로 교체하고 거기에서 이동합니다. 너무 아프거나 아무것도 아닙니다.


1

프로젝트에서 접두사가있는 파일에 구성을 저장 한 다음 빌드 시스템이 현재 시스템의 호스트 이름을 기반으로 적절한 구성을 가져옵니다. 이는 비교적 소규모 팀에서 잘 작동하므로 새 구성 항목을 추가 할 때 / 할 때 다른 사람의 파일에 구성 변경 사항을 적용 할 수 있습니다. 분명히 이것은 개발자 수가 무제한 인 오픈 소스 프로젝트로 확장되지 않습니다.


1

여기에 두 가지 문제가 있습니다.

  • 먼저 소프트웨어와 함께 제공되는 구성 파일을 제어해야합니다.

    개발자가 개발 환경에서 동일한 파일을 사용하는 경우 개발자가 원하지 않는 마스터 구성 파일 변경을 체크인하는 것은 쉽습니다.

    반면에 설치 프로그램에 포함 된 별도의 구성 파일이있는 경우 새 설정을 추가하는 것을 잊거나 그 안의 주석이 계승의 주석과 동기화되지 않도록하는 것은 매우 쉽습니다. 구성 파일.

  • 그런 다음 다른 개발자가 새 구성 설정을 추가 할 때 개발자가 구성 파일 사본을 최신 상태로 유지해야하는 문제가 있습니다. 그러나 데이터베이스 연결 문자열과 같은 일부 설정은 개발자마다 다릅니다.

  • 질문 / 답변이 다루지 않는 세 번째 문제가 있습니다. 새 버전의 소프트웨어를 설치할 때 고객이 구성 파일에 적용한 변경 사항을 어떻게 병합합니까?

나는 아직 모든 경우에 잘 작동하는 좋은 솔루션을 보지 못했지만 문제를 많이 줄이는 부분 솔루션 (필요에 따라 다른 조합으로 결합 할 수 있음) 을 보았습니다 .

  • 먼저 기본 구성 파일에있는 구성 항목의 수를 줄이십시오.

    고객이 매핑을 변경하도록 할 필요가없는 경우 Fluent NHibernate (또는 기타)를 사용하여 구성을 코드로 이동하십시오.

    의존성 주입 설정도 마찬가지입니다.

  • 가능하면 구성 파일을 분할하십시오. 예를 들어 별도의 파일을 사용하여 Log4Net 로그를 구성하십시오.

  • 여러 구성 파일 사이에 항목을 반복하지 마십시오. 예를 들어 동일한 시스템에 모두 4 개의 웹 응용 프로그램이 설치된 경우 각 응용 프로그램의 web.config 파일이 가리키는 전체 구성 파일이 있습니다.

    (기본적으로 상대 경로를 사용하므로 web.config 파일을 변경해야하는 경우는 거의 없습니다.)

  • 개발 구성 파일을 처리하여 배송 구성 파일을 가져옵니다.

    빌드가 완료되면 구성 파일에 설정되는 Xml 주석에 기본값이 있습니다. 또는 설치 프로그램 생성 프로세스의 일부로 삭제 된 섹션이 있습니다.

  • 데이터베이스 연결 문자열을 하나만 사용하는 대신 개발자 당 하나씩 사용하십시오.

    예를 들어 런타임에 구성 파일에서 "database_ianr"(여기서 ianr은 내 사용자 이름 또는 컴퓨터 이름)를 먼저 찾고, 찾을 수없는 경우 "database"를 찾습니다.

    두 번째 수준 "예 : -oracle 또는 -sqlserver"를 사용하면 개발자가 두 데이터베이스 시스템에 더 빨리 접근 할 수 있습니다.

    물론 다른 구성 값에 대해서도 수행 할 수 있습니다.

    그런 다음 구성 파일을 전달하기 전에 "_userName"으로 끝나는 모든 값을 스트라이프 할 수 있습니다.

그러나 결국 당신은 위 또는 다른 방법으로 구성 파일 (들)을 책임감있게 관리하는 "구성 파일의 소유자"입니다. 또한 각 배송 전에 고객이 직면 한 구성 파일을 비교해야합니다.

이렇게 부족한 문제를 돌보는 사람의 필요성을 제거 할 수는 없습니다.


1

구성 파일의 데이터 민감도 또는 사용중인 프로그래밍 언어 및 기타 여러 요인에 따라 달라질 수 있으므로 모든 경우에 작동하는 단일 솔루션은 없다고 생각합니다. 그러나 모든 환경에 대한 구성 파일을 소스 제어하에 유지하는 것이 중요하다고 생각하므로 언제 누가 변경되었는지 항상 알 수 있으며 문제가 발생하면 복구 할 수 있습니다. 그리고 그들은 할 것입니다.

그래서 여기에 내가하는 방법이 있습니다. 이것은 보통 nodejs 프로젝트 용이지만 다른 프레임 워크와 언어에서도 작동한다고 생각합니다.

내가하는 일은 configs프로젝트의 루트에 디렉토리를 만들고 그 디렉토리 아래에 소스 제어에서 모두 추적되는 모든 환경 (및 각 개발자의 환경에 대한 별도의 파일도 포함)에 대한 여러 파일을 보관합니다. 그리고 코드가 사용하는 실제 파일이 config프로젝트의 루트에 명명 되었습니다. 추적되지 않는 유일한 파일입니다. 그래서 이렇게 생겼어요

root
|
|- config (not tracked)
|
|- configs/ (all tracked)
    |- development
    |- staging
    |- live
    |- James

누군가가 프로젝트를 체크 아웃하면 추적되지 않은 config파일 에서 사용하려는 구성 파일을 복사하고 원하는 대로 편집 할 수 있지만 필요에 따라 다른 환경 파일에 커밋하기 전에 이러한 변경 사항을 복사 할 책임이 있습니다.

그리고 서버에서 추적되지 않은 파일은 단순히 해당 환경에 해당하는 추적 된 파일의 복사본 (또는 참조) 일 수 있습니다. JS에서는 해당 파일을 요구하는 한 줄만 있으면됩니다.

이 흐름은 처음에는 약간 복잡 할 수 있지만 큰 장점이 있습니다. 1. 백업없이 서버에서 구성 파일이 삭제되거나 수정되는 것에 대해 걱정할 필요가 없습니다. 2. 개발자가 자신의 사용자 지정 구성을 가지고있는 경우에도 마찬가지입니다. 기계와 그 기계는 당신이 설정 파일을 diff를 수있는 배포하기 전에 어떤 이유로 3에 대한 작동을 중지 development하고 staging, 예를 들어 누락 또는 파손 아무것도가 있는지.


0

프로덕션 구성 파일은 체크인 된 상태로 유지합니다. 준비 또는 개발을 위해 소스에서 안전하게 파일을 가져올 때 파일을 변경하는 것은 개발자의 책임입니다. 이것은 과거에 우리를 태 웠기 때문에 나는 그것을 제안하지 않을 것입니다.


0

나는 같은 문제에 직면했고 그것에 대한 해결책을 찾았습니다. 먼저 모든 파일을 중앙 저장소 (개발자 파일)에 추가했습니다.

따라서 개발자가 저장소에서 파일을 가져 오면 개발자 구성도 있습니다. 이 파일을 변경할 때 Git은 이러한 변경 사항을 인식하지 않아야합니다. 이렇게하면 변경 사항을 리포지토리에 푸시 / 커밋 할 수 없지만 로컬로 유지합니다.

git 명령을 사용하여이 문제를 해결했습니다 update-index --assume-unchanged.. Git에서 변경 사항을 무시해야하는 파일이 포함 된 프로젝트의 사전 빌드에서 실행되는 bat 파일을 만들었습니다. 다음은 bat 파일에 넣은 코드입니다.

IF NOT EXIST %2%\.git GOTO NOGIT
set fileName=%1
set fileName=%fileName:\=/%
for /f "useback tokens=*" %%a in ('%fileName%') do set fileName=%%~a
set "gitUpdate=git update-index --assume-unchanged"
set parameter= "%gitUpdate% %fileName%"
echo %parameter% as parameter for git
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c %parameter%
echo Make FIleBehaveLikeUnchangedForGit Done.
GOTO END
:NOGIT
echo no git here.
echo %2%
:END

내 사전 빌드에서 다음과 같이 bat 파일을 호출했습니다.

call "$(ProjectDir)\..\..\MakeFileBehaveLikeUnchangedForGit.bat" "$(ProjectDir)Web.config.developer" "$(SolutionDir)"

나는 올바른 설정 파일을 web.config / app.config에 복사하는 bat 파일을 찾았습니다. 또한 사전 빌드에서이 bat 파일을 호출합니다. 이 bat 파일의 코드는 다음과 같습니다.

@echo off
echo Comparing two files: %1 with %2
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound
fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy
echo Files are not the same.  Copying %1 over %2
copy %1 %2 /y & goto END
:NoCopy
echo Files are the same.  Did nothing
goto END
:File1NotFound
echo %1 not found.
goto END
:File2NotFound
copy %1 %2 /y
goto END
:END
echo Done.

내 사전 빌드에서 다음과 같이 bat 파일을 호출했습니다.

call "$(ProjectDir)\..\..\copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.