Visual Studio에서 웹 프로젝트가 아닌 프로젝트에 대한 App.Config 변환?


546

Visual Studio 2010 웹 기반 응용 프로그램에는 다양한 환경에 대해 여러 구성 파일을 유지 관리 할 수있는 구성 변환 기능이 있습니다. 그러나 Windows Services / WinForms 또는 콘솔 응용 프로그램의 App.Config 파일에는 동일한 기능을 사용할 수 없습니다.

여기에 제안 된 해결 방법이 있습니다 : App.Config에 XDT 매직 적용 .

그러나 간단하지 않으며 여러 단계가 필요합니다. app.config 파일에 대해 더 쉬운 방법이 있습니까?


나는 조금 더 단순하게 보이는 다음 기사를 보았지만 직접 시도하지는 않았다. fknut.blogspot.com/2009/11/… 또한 MS Connect에는 투표 할 가치가있는 기능 요청이 있으므로 다음 SP 또는 버전의 보드 전체에 포함됩니다. connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

답변:


413

이제이 기사에서 처리 한 Visual Studio AddIn에서 작동합니다. 이제 XML 구성 파일에 대해 일반화 된 SlowCheetah-Web.config 변환 구문이 있습니다 .

web.config를 마우스 오른쪽 단추로 클릭하고 "구성 변환 추가"를 클릭하십시오. 이렇게하면 web.debug.config와 web.release.config가 나타납니다. 이름이 구성 프로파일과 일치하는 한 원하는 경우 web.whatever.config를 만들 수 있습니다. 이러한 파일은 web.config의 전체 사본이 아니라 원하는 변경 사항 일뿐입니다.

XSLT를 사용하여 web.config를 변환하고 싶다고 생각할 수도 있지만, 직관적으로 옳다고 느끼지만 실제로는 매우 장황합니다.

XSLT를 사용하는 것과 XML Document Transform 구문 / 네임 스페이스를 사용하는 것과 같은 두 가지 변환이 있습니다. 모든 작업과 마찬가지로 XSLT에는 여러 가지 방법이 있지만 일반적인 아이디어를 얻습니다. XSLT는 일반화 된 트리 변환 언어이며이 배포 언어는 일반적인 시나리오의 특정 하위 집합에 최적화되어 있습니다. 그러나 멋진 부분은 각 XDT 변환이 .NET 플러그인이므로 자신만의 것을 만들 수 있다는 것입니다.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

또는 배포 변환을 통해 동일한 내용 :

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

오, 달콤합니다! 수많은 구성 파일 (log4net, nHibernate, web.config)을 가진 앱을 만들고 그것들을 모두 변경하는 것을 기억하는 것은 약간의 고통이었습니다. CruiseControl.NET으로 코드를 옮기기를 기대하지는 않았지만 바람도 마찬가지입니다.
DilbertDave 2016 년

10
참고로 SlowCheetah는 VS 2014 이후에는 지원되지 않는 환상적인 확장 기능 이었습니다 .
bdeem

5
@andrewb, 나는 그것을 여기에서 읽었다 . 그러나 그것은 1 년 전이었습니다. 스레드를 다시 방문하고 주석을 읽은 후 누군가가 VS2015 에서 작동하는 버전을 제공 한 것처럼 보입니다 .
Anil Natha

2
비주얼 스튜디오 2017 및 Visual Studio 2019와 함께 완벽하게 작동
Guilherme 드 예수 산토스

1
그건 여기 지금
휴고 Freitas의

573

나는 여러 가지 해결책을 시도했으며 여기 내가 개인적으로 찾은 가장 간단한 것입니다.
댄은 그 의견에 지적 원래의 게시물 에 속한다 올렉 Sych - 감사, 올렉!

지침은 다음과 같습니다.

1. 각 구성에 대한 XML 파일을 프로젝트에 추가하십시오.

일반적으로 구성 DebugRelease구성이 가능하므로 파일 이름 App.Debug.configApp.Release.config. 내 프로젝트에서 각 종류의 환경에 대한 구성을 만들었으므로 실험 해 볼 수 있습니다.

2. 프로젝트를 언로드하고 편집을 위해 .csproj 파일을 엽니 다

Visual Studio를 사용하면 편집기에서 .csproj 파일을 바로 편집 할 수 있습니다 . 먼저 프로젝트를 언로드하면됩니다. 그런 다음 마우스 오른쪽 단추로 클릭하고 <ProjectName> .csproj 편집을 선택 하십시오 .

3. App. *. config 파일을 기본 App.config에 바인딩

모두 App.configApp.*.config참조 가 포함 된 프로젝트 파일 섹션을 찾으십시오 . 빌드 작업이 다음과 None같이 설정되어 있습니다 .

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

먼저 모든 빌드 작업을로 설정하십시오 Content.
다음으로 모든 구성 관련 파일을 기본 파일에 종속되게 하여 App.configVisual Studio가 디자이너 및 코드 숨김 파일처럼 그룹화합니다.

위의 XML을 아래의 것으로 바꾸십시오.

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. 변형 마법 활성화 ( VS2017 이전의 Visual Studio 버전에만 필요 )

파일 끝에서

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

그리고 마지막 전에

</Project>

다음 XML을 삽입하십시오.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

이제 프로젝트를 다시로드하고 빌드하고 App.config변형을 즐길 수 있습니다 !

참고로

App.*.config파일이 다음과 같이 올바르게 설정되어 있는지 확인하십시오 .

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

4
고마워요! csproj를 편집 한 후 새 .config 파일을 프로젝트에 추가하면 App.config 아래에 그룹화되어 표시됩니다. 나는 csproj를 편집하기 전에 하나를 추가했고 본질적으로 하나의 그룹화 된 하나와 하나의 솔로 된 두 개의 링크로 끝났습니다.
Jeff Swensen

8
이 접근 방식의 한 가지 문제점은 프로젝트 속성의 "게시"탭을 살펴본 후 "응용 프로그램 파일"버튼을 클릭하면 app.config, app.Debug.config, app.Release.config는 게시 프로세스의 일부로 배포됩니다. 물론, 당신은 올바른 MyApp.exe.config 파일도 얻지 만 여분의 수하물을 배포하고 싶지는 않습니다. 프로젝트에서 app. *. config 파일을 <Content> 대신 <None>으로 유지하는 방법이 필요합니다.
Lee Grissom 18

6
이것이 일부 사람들에게 없어지는 한 가지 문제는 원래 Oleg Sych에서 가져온 대답이 핵심 부분을 벗어난 것입니다. 개별 app. (env) .configs에 '<configuration xmlns : xdt = " schemas.microsoft.com/XML-Document-Transform ">'및 <appSettings xdt : Transform = "Replace">와 같은 것을 나열하지 마십시오 . 또는 설정 라인에서 유사한 작업을 수행하는 속성은 작동하지 않습니다. 이 마지막 정보는 중요하며 일단 추가하면 모두 작동하기 시작합니다.
djangojazz

24
당신은 대체 할 수 v10.0와 함께 v$(VisualStudioVersion)프로젝트 VS.의 모든 이후 버전의 작업을 수행 확인
Thibault D.

14
오류 MSBuild 오류 MSB3021 : 파일을 복사 할 수 없습니다. 빌드 중에 'obj \ Release \ ConsoleApp.exe'파일을 찾을 수 없습니다. 그래서 솔루션에서 새로운 것을 만드는 대신 대상 <Target Name = "AfterBuild"> 섹션을 재사용하도록 솔루션을 약간 변경했습니다.
asidis

137

내가 찾은 또 다른 솔루션은 변환을 사용하지 않고 app.Release.config와 같은 별도의 구성 파일 만 갖는 것입니다. 그런 다음이 줄을 csproj 파일에 추가하십시오.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

이는 올바른 myprogram.exe.config 파일을 생성 할뿐만 아니라 Visual Studio에서 설치 및 배포 프로젝트를 사용하여 MSI를 생성하는 경우 패키징 할 때 배포 프로젝트가 올바른 구성 파일을 사용하도록합니다.


6
MSBuild의 놀라운 경이로움. 이제 다른 것이 가능한지 궁금합니다. Btw. 이것은 투표율이 높은 답변과 달리 VS에서 직접 클릭 한 번으로 배포하는 경우에도 작동합니다.
보리스 B.

4
구성에 모든 빌드에 대해 동일한 항목이 많이 포함되어 있으면 변경이 번거롭고 오류가 발생하기 쉽습니다. 한 환경의 .config가 변경 사항을 놓친 문제와 프로덕션 문제였습니다.
jeepwran

1
개발자가 수동으로 관리하지 않는 한 구성 파일의 사본 두 개를 갖는 것은 문제가되지 않습니다.
IBMer

1
이것은 아름답고 매력처럼 작동합니다! 나는 구성에 대한 <AppConfig>App.Release.config</AppConfig>기존 <PropertyGroup조건 안에 줄을 붙여 Release넣었고 IDE는 <AppConfig>스키마 아래 에 없다는 것을 나타내는 줄 아래에 구불 구불 한 줄을 보였지만 어쨌든 파일을 저장하고 프로젝트 파일을 다시로드하고 빌드했습니다. Release구성 에서 작동했습니다!
시바

1
이렇게하면 설정 디자이너의 기능이 손실됩니다.
Ondřej

33

내 경험상 환경에 맞게 만들어야하는 것은 연결 문자열, 설정 및 종종 smpt 설정과 같은 것입니다. 구성 시스템은 이러한 것들을 별도의 파일로 지정할 수 있습니다. 따라서 app.config / web.config에서 이것을 사용할 수 있습니다.

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

내가 일반적으로하는 것은 이러한 구성 관련 섹션을 별도의 파일에 ConfigFiles라는 하위 폴더에 넣는 것입니다 (솔루션 루트 또는 프로젝트 수준에 따라 다름). 구성 당 파일 (예 : smtp.config.Debug 및 smtp.config.Release)을 정의합니다.

그런 다음 사전 빌드 이벤트를 다음과 같이 정의 할 수 있습니다.

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

팀 개발시 컨벤션에 % COMPUTERNAME % 및 / 또는 % USERNAME %을 (를) 포함하여이 문제를 더 조정할 수 있습니다.

물론 이는 대상 파일 (x.config)이 소스 제어에 생성되지 않아야 함을 의미합니다 (생성되기 때문에). 여전히 프로젝트 파일에 추가하고 출력 유형 속성을 '항상 복사'또는 '최신 경우 복사'로 설정해야합니다.

간단하고 확장 가능하며 모든 유형의 Visual Studio 프로젝트 (콘솔, winforms, wpf, 웹)에서 작동합니다.


나는 당신과 정확히 같은 구성을 가지고 있습니다. 그러나 smtp 파일을 변환하는 데 문제가 있습니다. 원본과 변형을 포함시킬 수 있습니까? 이것들은 내 것입니다 : 기본 파일 : <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> 변형 :<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="user@email.com" deliveryMethod="Network"> <network .../> </smtp>
jgarza

잘 모르겠습니다. 이 구성에서는 아무것도 변환하지 않고 파일을 복사하는 중입니다.
jeroenh

아, 나는 사본 부분을 보지 못했다. 구성을 복사하지 않고 변환합니다. 어쨌든 고마워
jgarza

나는이 해결책을 좋아한다. 작은 제안 하나 : 위의 복사 예제에서 복사의 소스 및 대상 인수는 따옴표로 묶어야합니다. 그렇지 않으면 이름에 공백이있는 디렉토리에 대해 사전 빌드가 실패합니다
vandre

32

이 질문에서 Oleg 와 다른 사람들에게 영감을 받아 https://stackoverflow.com/a/5109530/2286801 솔루션을 한 단계 더 발전시켜 다음을 가능하게했습니다.

  • ClickOnce와 함께 작동
  • VS 2010의 설치 및 배포 프로젝트와 함께 작동
  • VS2010, 2013, 2015에서 작동합니다 (2012도 테스트하지는 않았지만 작동하지는 않습니다).
  • 팀 빌드와 함께 작동합니다. (A) Visual Studio 또는 B를 설치해야합니다. Microsoft.Web.Publishing.targets 및 Microsoft.Web.Publishing.Tasks.dll)

이 솔루션은 MSBuild 프로세스에서 app.config를 처음 참조하기 전에 app.config 변환을 수행하여 작동합니다. 여러 프로젝트에서보다 쉽게 ​​관리 할 수 ​​있도록 외부 대상 파일을 사용합니다.

명령:

다른 솔루션과 비슷한 단계. 나는 똑같은 것을 인용하고 완벽하고 쉬운 비교를 위해 그것을 포함시켰다.

0. AppConfigTransformation.targets라는 새 파일을 프로젝트에 추가하십시오.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. 각 구성에 대한 XML 파일을 프로젝트에 추가하십시오.

일반적으로 디버그 및 릴리스 구성이 있으므로 파일 이름을 App.Debug.config 및 App.Release.config로 지정하십시오. 내 프로젝트에서 각 종류의 환경에 대한 구성을 만들었으므로 실험 해 볼 수 있습니다.

2. 프로젝트를 언로드하고 편집을 위해 .csproj 파일을 엽니 다

Visual Studio를 사용하면 편집기에서 바로 .csproj를 편집 할 수 있습니다. 먼저 프로젝트를 언로드하면됩니다. 그런 다음 마우스 오른쪽 버튼으로 클릭하고 .csproj 편집을 선택하십시오.

3. App. *. config 파일을 기본 App.config에 바인딩

모든 App.config 및 App. *. config 참조가 포함 된 프로젝트 파일 섹션을 찾아 다음과 같이 바꾸십시오. 콘텐츠 대신 없음을 사용하는 것을 알 수 있습니다.

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. 변형 마법 활성화

파일 끝에서

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

그리고 마지막 전에

</Project>

다음 XML을 삽입하십시오.

<Import Project="AppConfigTransformation.targets" />

끝난!


1
VS Community 2015 RC에서 시도했지만 내가 가지고있는 app.Debug.config 파일을 무시합니다.
Khainestar

하나의 WinForms 프로젝트에서 허용되는 답변을 성공적으로 사용했습니다. 다른 WinForms 프로젝트 (모두 동일한 솔루션). @bdeem의 대답은 내 새로운 fave입니다-MSI 프로젝트와 올바르게 상호 운영되므로 큰 감사합니다!
bkwdesign

VS 2015에서는 작동하지 않는 것 같습니다. VisualStudioVersion을 10에서 12로 업데이트했지만 주사위는 없습니다. 어떤 아이디어?
Sinaesthetic

@Sinaesthetic 자세한 내용을 알려 주시겠습니까? VS 2015 Ultimate, Community 등 VB.NET, C #, 오류가 있습니까?
bdeem

VS2015 엔터프라이즈. 오류가 없습니다. 그것은 아무것도하지 않습니다.
Sinaesthetic

27

구성마다 별도의 구성 파일 (예 : app.Debug.config, app.Release.config)을 사용한 다음 프로젝트 파일에서 구성 변수를 사용할 수 있습니다.

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

그러면 빌드하는 구성에 따라 올바른 ProjectName.exe.config 파일이 생성됩니다.


고맙게도, 나는 당신이 가지고있는 문제를 해결하기 위해 정확한 예제를 사용하지 않았지만 귀하의 예제는 저를 생각하게하고 복사 작업을 사용하여 또 다른 매우 유사한 해결책으로 이끌었습니다.
jpierson

VS 2015 Community RC에서 이것을 시도하고 빌드했지만 앱의 내용을 무시합니다. *. config 내가 추가했습니다.
Khainestar

14

웹 응용 프로그램 프로젝트 구성 변환 과 같은 app.config 변환을 자동화하는 멋진 확장 기능을 작성했습니다.

이 확장의 가장 큰 장점은 모든 빌드 시스템에 확장을 설치할 필요가 없다는 것입니다


1
매우 유용한 확장 기능, 특히 Slow Cheetah가 유지 관리 모드로 전환되어 향후 지원되지 않을 수 있습니다.
dthrasher

이제이 기능이 이제 transformxml msbuild 작업에서 지원 될 때이를위한 솔루션으로 사람들은 치타 속도를 늦추지 않아야합니다. 우리 팀의 sw 아키텍트는 프로젝트에 과도하게 느린 치타를 도입했으며 모든 구성의 디버그, 스테이지 및 릴리스 변환을 만들었습니다. 대부분 변환이 필요하지 않았습니다. 말할 것도없이, 그가 떠난 순간 나는 느린 치타를 꺼내고 이제는 web.config에서 단일 변환 XML 작업을 사용합니다. 아아, 단순함. 느린 치타에는 시간과 장소가 없었습니다.
HarryTuttle

5

Visual Studio에서 Marketplace의 "Configuration Transform Tool"을 설치하고 VS를 다시 시작하십시오. app.config의 메뉴 미리보기 변환도 볼 수 있습니다.

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform


1
이것은 완벽하게 작동하며 약간의 노력이나 생각이 필요합니다. 매우 감사. 감사. ( '미리보기 변환'은 작동하지 않지만 '변환 추가'는 VS 2017에서 문제없이 완벽하게 작동합니다). 또한 자주 업데이트를받는 것 같습니다.
adudley

1
무대 뒤에서 해결책을 주셔서 대단히 감사합니다. Dan Abramov가 손을 더럽 히지 않고 위에서 설명한 것을 정확하게 수행합니다.
Mohammed Dawood Ansari

이것이 궁극적 인 해결책입니다. 미리보기는 VS 2019에서 잘 작동하는 것 같습니다.
Kyle Champion

1
나는 그것을 좋아하지만 csproj를 편집하지 않고 다른 비 app.config 파일을 지원하지 않는다는 것을 알았습니다. 그래도 미리보기를 보는 것이 좋습니다.
Ian1971

4

그래서 나는 약간 다른 접근법을 취했습니다. 3 단계에서 Dan의 단계를 수행했지만 App.Base.Config라는 다른 파일을 추가했습니다. 이 파일에는 생성 된 모든 App.Config에서 원하는 구성 설정이 포함되어 있습니다. 그런 다음 BeforeBuild (Yuri의 TransformXml 추가)를 사용하여 기본 구성의 현재 구성을 App.config로 변환합니다. 그런 다음 빌드 프로세스는 변환 된 App.config를 정상적으로 사용합니다. 그러나 한 가지 성가신 점은 나중에 변경되는 App.config를 소스 제어에서 제외하려는 것이지만 다른 구성 파일은 이제 그것에 의존합니다.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="BeforeBuild" Condition="exists('app.$(Configuration).config')">
    <TransformXml Source="App.Base.config" Transform="App.$(Configuration).config" Destination="App.config" />
  </Target>

3

지금 어디에나 게시되는 것처럼 보이는 솔루션이 약간 개선되었습니다.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • 즉, 현재 VS 버전을 영원히 유지할 계획이 아니라면

약간의 답변이나 설명을위한 자료를 제공해 주시겠습니까?
roydukkey

4
$(VisualStudioVersion)MSBuild를 직접 사용할 때 설정된 것처럼 보이지 않습니다 .
Jeremy Smith

이것은 stackoverflow.com/a/5109530/2003763에 대한 의견이어야합니다 (방금 주석과 동일한 정보를 추가했습니다)
Thibault D.

2

빌드 조치를 컨텐츠 로 변경해야하는 요구 사항이 Vishal Joshi가 게시 한 대안에 대한 다른 대안을 작성했습니다. 이 제거되고 ClickOnce 배포에 대한 기본 지원도 구현되었습니다. 철저히 테스트하지 않았기 때문에 기본이라고 말하지만 일반적인 ClickOnce 배포 시나리오에서는 작동합니다.

이 솔루션은 기존의 Windows 응용 프로그램 프로젝트 (* .csproj)로 가져온 단일 MSBuild 프로젝트로 구성 프로세스를 확장하여 app.config 변환을 고려합니다.

Visual Studio App.config XML 변환 에서 더 자세한 설명을 읽을 수 있으며 MSBuild 프로젝트 파일은 GitHub에서 다운로드 할 수 있습니다 .


1

TFS 온라인 (클라우드 버전)을 사용하고 프로젝트에서 App.Config를 변환하려는 경우 추가 도구를 설치하지 않고 다음을 수행 할 수 있습니다. VS에서 => 프로젝트 언로드 => 프로젝트 파일 편집 => 파일 맨 아래로 이동하여 다음을 추가하십시오.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

AssemblyFile 및 대상은 로컬 사용 및 TFS 온라인 (클라우드) 서버에서 작동합니다.


0

구성 파일이있는 클래스 라이브러리가 다른 프로젝트 (내 경우에는 Azure Worker 프로젝트 라이브러리)에서 참조 될 때 제안 된 솔루션이 작동하지 않습니다. 올바른 변환 된 파일을 obj폴더 에서 폴더로 복사하지 않습니다 bin\##configuration-name##. 최소한의 변경으로 작동하게하려면 AfterCompile대상을 BeforeCompile다음 으로 변경해야 합니다 .

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.