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


115

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 파일을 조정하는 표준 접근 방식은 무엇입니까?

답변:


154

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>

두 번째 솔루션은 잘 작동하지만 웹 프로젝트 게시에는 적합하지 않습니다. ASP.NET 프로젝트를 게시 한 후 원본 web.config가 게시됩니다.
Massood Khaari

3
@MassoodKhaari는 게시 대상에 대해이 작업이 호출되었는지 확인해야합니다. 프로젝트를 게시 할 때 별도의 빌드 대상이 호출되며 기본 AfterBuild대상으로 호출되지 않을 수 있습니다 . 일반적인 컴파일 중에 AfterBuild대상은 기본적으로 호출됩니다. 게시 사례에 대한 빠른 수정이 있어야합니다.
oleksii 2014-06-25

1
두 번째 방법을 사용했습니다. 프로젝트 속성에 가서 편집 BeforeBuild을 을 복사하는 App.<Target>.config오버 App.config에서 프로젝트 디렉토리 가 아닌 출력 디렉토리.
SparK 2014-06-27

@oleksii 당신이 맞아요. 하지만 내 웹 게시 프로세스가 사용중인 대상 (Visual Studio 2013)을 여전히 찾을 수 없습니다.
Massood Khaari 2014-06-28

1
두 번째 방법을 사용하고 있지만 삭제하기 전에 파일이 실제로 존재하는지 확인하기 위해 AfterBuild 대상에 조건을 추가해야했습니다. 기본적으로 기본 App.config 파일 만 사용하는 디버그 빌드 구성이 있지만 App.Debug.config가 없어 빌드 단계가 실패합니다. 방금 추가했습니다 Condition="Exists('$(ProjectDir)App.$(Configuration).config')".
Siewers

23

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

  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 프로젝트의 다른 항목에서는 제대로 작동했습니다. 원하는 거의 모든 방식으로 빌드 프로세스를 사용자 지정할 수 있습니다. 어쨌든 결과를 알려주세요.


대답은 Tnx이지만 app.config에서는 작동하지 않습니다. VS는 필수 app.config가 필요하며 VS 빌드 또는 Teamcity VS sln 빌드 러너를 사용하는 경우 릴리스 구성을 적용하지 않습니다.
oleksii 2011

2
방법은 다음과 같습니다. app.debug.config 활성화 app.release.config
Gabrielizalo

1
이 답변에 찬성표가 많은 이유는 무엇입니까? 나는 그것을 시도했지만 작동하지 않습니다. 실제로 디버그 및 릴리스 모드에는 App.config 파일이 없으므로 출력 폴더에 해당 파일이 없습니다. App.Debug.config 및 App.Release.config 파일은 Visual Studio에서 의미가 없습니다.
MarkusParker 2017

작동하지 않습니다. .csproj를 열 수 없습니다. 오류 메시지 "대상 요소 외부에있는 요소는 포함, 업데이트 또는 제거해야합니다."
Elo

12

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) 스위치에 지정된 생성 된 구성으로 대체됩니다.


2
대답에 대한 Tnx, 이것은 나쁘지 않은 것 같습니다. 그러나 몇 가지 단점이 있습니다. 다운로드 횟수가 75 회에 불과하며 (따라서 성숙하지 않음) .xls 또는 .xlsx에서만 작동합니다. 간단한 작업을 위해 또 다른 사용자 정의 문서 형식에 의존하고 싶지는 않습니다. 더 표준적인 접근 방식을 찾고있었습니다 ...
oleksii 2011

2
CodePlex에서 194 회 다운로드가 가능하지만 xls는 스프레드 시트이며 사용자 지정 형식이 아닙니다. 저는 이것을 사용하도록 승인 한 3 개의 주요 투자 은행을 알고 있습니다. 현재 요청 된 기능 중 하나는 설정에 xml을 사용하는 것입니다. 거의 준비가되었지만 어쨌든 스프레드 시트 방식을 선호합니다. 이 표보기에서 모든 환경에 대한 모든 설정을 볼 훨씬 쉽다
다니엘 다이슨

이제 우리는 xml이 아닌 일반 텍스트 파일을 생성하는 데 사용할 수있는 configGen 버전을 테스트하는 마지막 단계에 있습니다. 당신은 자바 스크립트 등 특정 환경의 CSS, SQL을 생성하려는 경우 그래서, configGen 사이트에서 눈을 떼지
다니엘 다이슨

해결책에 대한 Daniel에게 감사드립니다. 이것이 바로 제가 찾던 것입니다. 나는 그것을 시도 할 것이다.
Bhupinder Singh 2017 년

10

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

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

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

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


3

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


3

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>


방금 Visual Studio 2017에서 시도했지만 작동하지 않습니다. 사격. 구현하기 가장 쉬운 것처럼 보이기 때문에 작동하기를 정말로 바랐습니다.
Greg Burghardt

TransformXml 태스크는 샘플에 정의되어 있지 않습니다. 항목을 추가하고 있습니다. 솔루션의 모든 시작 프로젝트에 포함되는 mycustom.targets 파일에서 정의 할 수 있습니다.
Eniola

@GregBurghardt, 지금 시도 하시겠습니까?
Eniola

나는 그것을 시도 할 수 있습니다. Visual Studio 용 Config Transform 플러그인을 설치했는데 정말 잘 작동했습니다. 실제로 플러그인이 기본적으로 귀하의 답변을 수행하는지 궁금합니다.
Greg Burghardt

좋아요, 어떻게되는지 알려주세요.
Eniola

1

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

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


이것이 지금 답이 될 것입니다. VS 2017에서 시도해 보았고 매력처럼 작동합니다. 프로젝트를 게시 할 필요가 없습니다. 그냥 빌드하세요. 지속적인 통합 빌드에서 사용하기위한 테스트 프로젝트에서 훌륭하게 작동하므로 헤드리스 모드에서 Selenium 테스트를 실행할 수 있지만 브라우저가 열린 상태에서 로컬로 실행됩니다. 내가 할 수 있다면 +1,000,000.
Greg Burghardt

1

여기에서 찾은 솔루션으로이 주제를 해결했습니다. http://www.blackwasp.co.uk/SwitchConfig.aspx

간단히 말해서 "빌드 후 이벤트를 추가하여. [...] 다음을 추가해야합니다.

if "Debug"=="$(ConfigurationName)" goto :nocopy
del "$(TargetPath).config"
copy "$(ProjectDir)\Release.config" "$(TargetPath).config"
:nocopy

지나치게 생각하는 사람들이 망쳐 놓은 매우 간단하고 필수적인 기능을 수행하는 가장 쉬운 방법입니다! 감사합니다 Janbro.
BoiseBaked

1

SlowCheetah에 대해 좋은 소식을 들었지만 제대로 작동하지 못했습니다. 나는 다음을 수행했습니다. 특정 구성에 대해 각각 am 태그를 추가합니다.

전의:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'UAT|AnyCPU'">
    <OutputPath>bin\UAT\</OutputPath>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AppConfig>App.UAT.config</AppConfig>
  </PropertyGroup>

이것은 빌드 구성별로 app.config 파일을 변경하는 또 다른 매우 간단한 방법처럼 보입니다. Mike, 표준 디버그 및 릴리스 구성으로 테스트 했습니까?
BoiseBaked

0

개발 및 빌드 등을위한 구성 관리에 대한 몇 가지 조사를 마친 후 직접 롤링하기로 결정하고 https://bitbucket.org/brightertools/contemplate/wiki/Home 에서 bitbucket에서 사용할 수 있도록했습니다.

여러 환경을위한이 여러 구성 파일은 모든 텍스트 기반 파일 형식에서 작동하는 기본 구성 항목 대체 도구입니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.