[.net] 여러 빌드 구성에 대해 다른 app.config를 선택하는 방법

MSTest 통합 테스트가 포함 된 dll 유형 프로젝트 가 있습니다. 내 컴퓨터에서 테스트가 통과되고 CI 서버에서도 동일한 작업이 수행되기를 원합니다 (TeamCity 사용). 하지만 app.config에서 일부 설정을 조정해야하므로 테스트가 실패합니다. 이것이 CI 서버에 대한 설정을 저장할 별도의 두 번째 app.config 파일을 가질 생각을 한 이유입니다.

그래서 나는 가지고 싶습니다

/ Sln
 / Proj
  app.config (VS에서 필요하다고 생각합니다)
  app.Release.config (독립 실행 형 독립 구성 파일)

따라서 CI의 빌드 구성에서 릴리스 구성을 선택하면 app.config 대신 app.Release.config 파일을 사용하고 싶습니다.

문제
이것은 단순한 .dll 유형 프로젝트에서는 간단하지 않은 것 같습니다. 웹 프로젝트의 경우 웹 구성 변환을 수행 할 수 있습니다. dll 유형 프로젝트에 대해 이러한 변환을 수행하는 방법에 대한 해킹을 찾았지만 해킹의 열렬한 팬은 아닙니다.

질문
.NET 프로젝트 (예 : Debug, Release 등)의 빌드 구성에 따라 app.config 파일을 조정하는 표준 접근 방식은 무엇입니까?



답변

SlowCheetah 플러그인을 사용하십시오 . 더 많은 옵션과 SlowCheetah 사용 방법에 대한 자세한 내용은 계속 읽으십시오.

이미 알고 있듯이 라이브러리 유형 (.dll) 프로젝트에 대해 다른 구성 파일을 사용하는 기본적이고 쉬운 방법은 없습니다 . 그 이유는 현재 생각이 “당신은 그럴 필요가 없습니다”입니다! 프레임 워크 개발자는 콘솔, 데스크톱, 웹, 모바일 앱 등 실행 파일에 대한 구성이 필요하다고 생각합니다. dll에 대한 구성을 제공하기 시작 하면, 구성 지옥 이라고 부를 수있는 것으로 끝날 수 있습니다 . 왜이 변수와 그 변수가 아무데도없는 것처럼 보이는 이상한 값을 갖는 이유를 더 이상 (쉽게) 이해하지 못할 수 있습니다.

“잠깐만”는 – 당신은 말할 수 있습니다 “하지만 난 내 통합 / 단위 테스트이 필요하고, 그것이 도서관!”. 그리고 그것은 사실이며 이것이 당신이 할 수있는 일입니다 (하나만 선택하고 섞지 마십시오) :

1. SlowCheetah-현재 설정 파일 변환

모든 저수준 XML 포킹 (또는 변환)을 수행하는 Visual Studio 플러그인 인 SlowCheetah 를 설치할 수 있습니다 . 작동 방식, 간단히 :

  • SlowCheetah를 설치하고 Visual Studio를 다시 시작합니다 (Visual Studio> 도구> 확장 및 업데이트 …> 온라인> Visual Studio 갤러리> “Slow Cheetah”검색).
  • 솔루션 구성을 정의합니다 ( 디버그릴리스 는 기본적으로 있음), 더 추가 할 수 있습니다 ( 솔루션 탐색기 > 구성 관리자 … > 활성 솔루션 구성 > 새로 만들기 … 에서 솔루션을 마우스 오른쪽 버튼으로 클릭
  • 필요한 경우 구성 파일 추가
  • 구성 파일> 변환 추가를 마우스 오른쪽 단추로 클릭하십시오.
    • 그러면 구성 당 하나의 변환 파일이 생성됩니다.
    • 변환 파일은 인젝터 / 뮤 테이터로 작동하며, 원래 구성 파일에서 필요한 XML 코드를 찾아 새로운 라인을 삽입하거나 필요한 값을 변경합니다.

2. .proj 파일로 바이올린 연주-완전히 새로운 구성 파일을 복사-이름 변경

원래 여기 에서 가져 왔습니다 . Visual Studio .proj 파일에 포함 할 수있는 사용자 지정 MSBuild 작업입니다 . 다음 코드를 프로젝트 파일에 복사하여 붙여 넣습니다.

<Target Name="AfterBuild">
    <Delete Files="$(TargetDir)$(TargetFileName).config" />
    <Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config"
          DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

이제라는 프로젝트에 폴더를 만들고 App.Debug.config , App.Release.config 등의 Config새 파일을 추가 합니다. 이제 구성에 따라 Visual Studio는 폴더 에서 구성 파일을 선택 하고 출력 디렉터리에 복사하여 이름을 바꿉니다. 따라서 PatternPA.Test.Integration 프로젝트와 디버그 구성을 선택한 경우 빌드 후 출력 폴더 에서 나중에 복사되어 이름이 변경된 PatternPA.Test.Integration.dll.config 파일을 찾을 수 있습니다.ConfigConfig\App.Debug.config

다음은 구성 파일에 남길 수있는 몇 가지 참고 사항입니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->

    <!-- Depending on the configuration the content of projectName.dll.config
        is fully substituted by the correspondent to build configuration file
        from the 'Config' directory. -->

</configuration>

Visual Studio에서 다음과 같은 것을 가질 수 있습니다.

프로젝트 구조

3. Visual Studio 외부에서 스크립팅 파일 사용

각 빌드 도구 (예 : NAnt , MSBuild )는 구성에 따라 구성 파일을 변환하는 기능을 제공합니다. 이는 릴리스를 위해 제품을 준비하는 내용과 방법에 대해 더 많은 제어가 필요한 빌드 머신에서 솔루션을 빌드하는 경우 유용합니다.

예를 들어 웹 게시 dll의 작업을 사용하여 모든 구성 파일을 변환 할 수 있습니다.

<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
    TaskName="TransformXml"/>

<PropertyGroup>
    <!-- Path to input config file -->
    <TransformInputFile>path to app.config</TransformInputFile>
    <!-- Path to the transformation file -->
    <TransformFile>path to app.$(Configuration).config</TransformFile>
    <!-- Path to outptu web config file -->
    <TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>

<Target Name="transform">
    <TransformXml Source="$(TransformInputFile)"
                  Transform="$(TransformFile)"
                  Destination="$(TransformOutputFile)" />
</Target>


답변

다음 접근 방식을 시도 할 수 있습니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 언로드를 선택 합니다.
  2. 프로젝트가 언로드됩니다. 프로젝트를 다시 마우스 오른쪽 버튼으로 클릭하고 <YourProjectName> .csproj 편집을 선택 합니다.
  3. 이제 Visual Studio 내에서 프로젝트 파일을 편집 할 수 있습니다.
  4. * .csproj 파일에서 응용 프로그램 구성 파일이 포함 된 위치를 찾습니다. 다음과 같이 표시됩니다.
    <항목 그룹>
        <없음 Include = "App.config"/>
    </ ItemGroup>
  1. 이 줄을 다음으로 바꿉니다.
    <ItemGroup Condition = " '$ (구성)'== '디버그'">
        <없음 Include = "App.Debug.config"/>
    </ ItemGroup>

    <ItemGroup Condition = " '$ (Configuration)'== 'Release'">
        <없음 Include = "App.Release.config"/>
    </ ItemGroup>

이 방법을 app.config파일에 시도 하지는 않았지만 Visual Studio 프로젝트의 다른 항목에서는 제대로 작동했습니다. 원하는 거의 모든 방식으로 빌드 프로세스를 사용자 지정할 수 있습니다. 어쨌든 결과를 알려주세요.


답변

ConfigGen 을 고려해야 합니다 . 이 목적을 위해 개발되었습니다. 템플릿 파일 및 설정 파일을 기반으로 각 배포 시스템에 대한 구성 파일을 생성합니다. 이것이 귀하의 질문에 구체적으로 답변하지 않는다는 것을 알고 있지만 귀하의 문제에 대한 답변이 될 수 있습니다.

따라서 디버그, 릴리스 등이 아니라 테스트, UAT, 프로덕션 등이있을 수 있습니다. 또한 각 개발자 컴퓨터에 대해 다른 설정을 가질 수 있으므로 개발 컴퓨터에 특정한 구성을 생성하고 다른 사람의 배포에 영향을주지 않고 변경할 수 있습니다. .

사용 예는 다음과 같습니다.

<Target Name="BeforeBuild">
    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />

    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>

이 파일을 .csproj 파일에 저장하고 다음 파일이있는 경우 …

$(ProjectDir)App.Config.Settings.xls

MachineName        ConfigFilePath   SQLServer

default             App.config      DEVSQL005
Test                App.config      TESTSQL005
UAT                 App.config      UATSQL005
Production          App.config      PRODSQL005
YourLocalMachine    App.config      ./SQLEXPRESS


$(ProjectDir)App.config.template.xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=[%SQLServer%];
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

… 그러면 이것이 결과가 될 것입니다 …

첫 번째 명령에서 xls 파일에 지정된 각 환경에 대해 생성 된 구성 파일은 $ (SolutionDir) ConfigGen 출력 디렉토리에 있습니다.

.../solutiondir/ConfigGen/Production/App.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=PRODSQL005;
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

두 번째 명령에서 dev 컴퓨터에서 사용되는 로컬 App.config는 로컬 (-l) 스위치와 파일 이름 (-n) 스위치에 지정된 생성 된 구성으로 대체됩니다.


답변

Romeo와 동일한 접근 방식을 사용하여 Visual Studio 2010에 적용했습니다.

 <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />

 <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />

여기에서 두 App.config 파일을 서로 다른 디렉터리 (appDebug 및 appRelease)에 보관해야합니다. 나는 그것을 테스트했고 잘 작동합니다!


답변

구성 파일 조작을 위해 XmlPreprocess 도구 를 사용 하고 있습니다. 여러 환경 (또는 귀하의 경우 여러 빌드 대상)에 대해 하나의 매핑 파일을 사용하고 있습니다. Excel로 매핑 파일을 편집 할 수 있습니다. 사용하기 매우 쉽습니다.


답변

VisualStudio Gallery의 SlowCheetah와 FastKoala는이 문제를 해결하는 데 매우 좋은 도구 인 것 같습니다.

그러나 추가 기능을 사용하지 않거나 빌드 / 통합 프로세스 전체에서 더 광범위하게 구현하는 원칙을 사용하려는 경우이를 msbuild * proj 파일에 추가하는 것이 간단한 수정입니다.

참고 : 이것은 @oleksii의 답변 2 번을 다소 재 작업 한 것입니다.

이것은 .exe 및 .dll 프로젝트에서 작동합니다.

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
  </Target>

이것은 웹 프로젝트에서 작동합니다.

  <Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
  </Target>

이 단계는 적절한 빌드가 시작되기 전에 발생합니다. 구성 파일의 변환은 프로젝트 폴더에서 발생합니다. 따라서 디버깅 할 때 변환 된 web.config를 사용할 수 있습니다 (SlowCheetah의 단점).

App_Config 폴더 (또는이를 호출하기 위해 선택한 폴더)를 만드는 경우 다양한 중간 구성 파일에는 빌드 작업 = 없음 및 출력 디렉터리에 복사 = 복사 안 함이 있어야합니다.

이것은 두 옵션을 하나의 블록으로 결합합니다. 조건에 따라 적절한 것이 실행됩니다. 하지만 TransformXml 작업이 먼저 정의됩니다.

<Project>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="TransformOnBuild" BeforeTargets="PrepareForBuild">
    <TransformXml Condition="Exists('App_Config\app.Base.config')" Source="App_Config\app.Base.config" Transform="App_Config\app.$(Configuration).config" Destination="app.config" />
    <TransformXml Condition="Exists('App_Config\Web.Base.config')" Source="App_Config\Web.Base.config" Transform="App_Config\Web.$(Configuration).config" Destination="Web.config" />
</Target>


답변

XDT (web.config) 변환 엔진이 도움이 될 수 있는지 확인하십시오. 현재는 웹 프로젝트에서만 기본적으로 지원되지만 기술적으로는 다른 애플리케이션 유형에서 사용하는 것을 막을 수 없습니다. 프로젝트 파일을 수동으로 편집하여 XDT를 사용하는 방법에 대한 많은 가이드가 있지만 훌륭하게 작동하는 플러그인을 찾았습니다 : https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

플러그인은 구성 설정에만 도움이되며 빌드 할 필요가 없으며 플러그인이나 기타 도구 없이도 다른 시스템이나 빌드 서버에서 솔루션을 빌드 할 수 있습니다.