C# - app.config 파일의 출력을 Configuration(Debug/Release)에 따라 제어하는 방법
대표적인 예로, Debug / Release 빌드 시 다른 app.config 출력을 원할 때가 있습니다. 예전에도 이와 관련한 예제를 다루긴 했는데요,
supportedRuntime 설정을 위한 app.config Transformation
; https://www.sysnet.pe.kr/2/0/1662
golavr/ConfigurationTransform
; https://github.com/golavr/ConfigurationTransform
아쉽게도 그때 소개한 Configuration Transform 도구가 비주얼 스튜디오 2022 버전을 지원하지 않습니다. github 프로젝트에 들어가 보면, "This work has been superseded by
https://docs.microsoft.com/en-us/dotnet/core/extensions/configuration"라는 문구가 나오는데요, 링크를 따라가 보면 그다지 관련 없는 듯한 내용의 "
Configuration in .NET" 글이 나옵니다. 이건 제 추측이지만 아마도 닷넷 코어부터 appsettings.json 방식이 새롭게 도입되면서 XML 방식의 app.config 지원을 스스로 포기한 것이 아닌가 싶습니다.
암튼, 이렇게 되면 본연의
XDT Transforms을 사용하거나,
XDT (web.config) Transforms in non-web projects
; https://devblogs.microsoft.com/dotnet/xdt-web-config-transforms-in-non-web-projects-2/
이것을 쉽게 처리해 주는 (웬일인지 마이크로소프트가 별도로 만든) 확장 도구를 사용하면 됩니다.
SlowCheetah
; https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms-VS2022
microsoft/slow-cheetah
; https://github.com/Microsoft/slow-cheetah
도구 설치 후, 가령 Console Application 프로젝트를 하나 만들고 app.config 파일을 마우스로 우클릭하면 아래와 같이 "Add Transform" 메뉴가 뜹니다.
이를 선택하면, 솔루션 탐색기의 app.config 파일 노드 하위로 다음과 같이 2개의 Debug/Release 변형 파일이 생성됩니다.
테스트를 위해 3개의 파일을 각각 다음과 같이 구성하고,
[app.config]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MySetting" value="Hello, World! - (Any)" />
<add key="DebugSetting" value="1" />
</appSettings>
</configuration>
[app.Debug.config]
<?xml version="1.0" encoding="utf-8"?>
<!--For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="MySetting" value="Hello, World! - (Debug)" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
[app.Release.config]
<?xml version="1.0" encoding="utf-8"?>
<!--For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="MySetting" value="Hello, World! - (Release)" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="DebugSetting" value="http://contoso.com/" xdt:Transform="Remove" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
코드를 작성한 후,
using System.Configuration;
internal class Program
{
// .NET Core/5+의 경우
// Install-Package System.Configuration.ConfigurationManager
static void Main(string[] args)
{
string? value = ConfigurationManager.AppSettings["MySetting"];
Console.WriteLine(value);
value = ConfigurationManager.AppSettings["DebugSetting"];
Console.WriteLine(value ?? "(null)");
}
}
실행해 보면 Debug/Release에 따라 각각 다음과 같은 결과를 얻을 수 있습니다.
// Debug로 빌드한 경우 실행 결과
Hello, World! - (Debug)
1
// Release로 빌드한 경우 실행 결과
Hello, World! - (Release)
(null)
(첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]