Chuyển đổi App.Config cho các dự án không phải là Dự án Web trong Visual Studio?


546

Đối với ứng dụng dựa trên web Visual Studio 2010, chúng tôi có các tính năng Chuyển đổi cấu hình để chúng tôi có thể duy trì nhiều tệp cấu hình cho các môi trường khác nhau. Nhưng tính năng tương tự không có sẵn cho các tệp App.Config cho Windows Services / WinForms hoặc Console Application.

Có một cách giải quyết có sẵn như được đề xuất ở đây: Áp dụng phép thuật XDT cho App.Config .

Tuy nhiên nó không đơn giản và đòi hỏi một số bước. Có cách nào dễ dàng hơn để đạt được điều tương tự cho các tệp app.config không?


Tôi đã xem qua bài viết sau đây có vẻ đơn giản hơn một chút nhưng tôi đã không tự mình thử nó. fknut.blogspot.com/2009/11/ Ngoài ra, có một yêu cầu tính năng trên MS Connect có thể đáng để bỏ phiếu để điều này được đưa vào bảng trong SP hoặc phiên bản tiếp theo. connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

Câu trả lời:


413

Điều này hiện hoạt động với Visual Studio AddIn được xử lý trong bài viết này: SlowCheetah - Cú pháp chuyển đổi Web.config hiện được khái quát hóa cho bất kỳ tệp cấu hình XML nào .

Bạn có thể nhấp chuột phải vào web.config và nhấp vào "Thêm Cấu hình chuyển đổi." Khi bạn làm điều này, bạn sẽ nhận được một web.debug.config và web.release.config. Bạn có thể tạo một web.whthing.config nếu bạn muốn, miễn là tên được xếp cùng với cấu hình cấu hình. Các tệp này chỉ là những thay đổi bạn muốn thực hiện, không phải là bản sao hoàn chỉnh của web.config.

Bạn có thể nghĩ rằng bạn muốn sử dụng XSLT để chuyển đổi web.config, nhưng trong khi họ cảm thấy bằng trực giác thì thực sự rất dài dòng.

Đây là hai biến đổi, một biến đổi sử dụng XSLT và một biến đổi sử dụng cú pháp / không gian tên Biến đổi tài liệu XML. Như với tất cả mọi thứ, có nhiều cách trong XSLT để làm điều này, nhưng bạn có ý tưởng chung. XSLT là ngôn ngữ chuyển đổi cây tổng quát, trong khi triển khai này được tối ưu hóa cho một tập hợp con cụ thể của các kịch bản phổ biến. Nhưng, điều thú vị là mỗi biến đổi XDT là một plugin .NET, vì vậy bạn có thể tự tạo.

<?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>

Hoặc điều tương tự thông qua chuyển đổi triển khai:

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

Ôi thật ngọt ngào! Có một ứng dụng có nhiều tệp cấu hình (log4net, nHibernate, web.config) và nhớ thay đổi tất cả chúng là một chút khó khăn. Tôi cũng không mong muốn chuyển mã vào CruiseControl.NET nhưng có vẻ như đó cũng là một cách dễ dàng.
DilbertDave

10
FYI, SlowCheetah là một phần mở rộng tuyệt vời mà bây giờ sẽ không được hỗ trợ sau VS 2014. Theo tác giả, Sayrah Ibrahim Hashimi, sedodream.com/2014/08/11/ .
bdeem

5
@andrewb, tôi đọc nó ở đây ; tuy nhiên, đó là một năm trước. Sau khi xem lại chủ đề và đọc các bình luận, có vẻ như ai đó đã cung cấp một phiên bản hoạt động với VS2015 tại đây .
Anil Natha

2
Hoạt động hoàn hảo với Visual Studio 2017 và Visual STudio 2019
Guilherme de Jesus Santos

1
Đó là ở đây tại
Hugo Freitas

573

Tôi đã thử một vài giải pháp và đây là cách đơn giản nhất mà cá nhân tôi tìm thấy.
Dan đã chỉ ra trong các ý kiến ​​rằng bài viết gốc thuộc về Oleg Sych - cảm ơn, Oleg!

Dưới đây là hướng dẫn:

1. Thêm một tệp XML cho mỗi cấu hình cho dự án.

Thông thường, bạn sẽ có DebugReleasecấu hình để đặt tên cho tệp của bạn App.Debug.configApp.Release.config. Trong dự án của tôi, tôi đã tạo một cấu hình cho từng loại môi trường, vì vậy bạn có thể muốn thử nghiệm điều đó.

2. Dỡ bỏ dự án và mở tệp .csproj để chỉnh sửa

Visual Studio cho phép bạn chỉnh sửa các tệp .csproj ngay trong trình soạn thảo, bạn chỉ cần dỡ dự án trước. Sau đó nhấp chuột phải vào nó và chọn Chỉnh sửa <ProjectName> .csproj .

3. Liên kết các tệp. *. Cấu hình thành App.config chính

Tìm phần tập tin dự án có chứa tất cả App.configApp.*.configtài liệu tham khảo. Bạn sẽ nhận thấy các hành động xây dựng của họ được đặt thành None:

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

Đầu tiên, thiết lập hành động xây dựng cho tất cả chúng Content.
Tiếp theo, làm cho tất cả các tệp cụ thể cấu hình phụ thuộc vào chính App.configđể Visual Studio nhóm chúng giống như các tệp thiết kế và mã phía sau.

Thay thế XML ở trên bằng một cái bên dưới:

<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. Kích hoạt ma thuật biến đổi (chỉ cần thiết cho các phiên bản Visual Studio trước VS2017 )

Vào cuối tập tin sau

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

và trước trận chung kết

</Project>

chèn XML sau:

  <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>

Bây giờ bạn có thể tải lại dự án, xây dựng nó và tận hưởng các App.configbiến đổi!

FYI

Đảm bảo rằng các App.*.configtệp của bạn có thiết lập đúng như thế này:

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

4
Cảm ơn rất nhiều cho điều này! Một lưu ý, nếu bạn thêm các tệp .config mới vào dự án sau khi bạn chỉnh sửa csproj, chúng sẽ hiển thị được nhóm lại trong App.config. Tôi đã thêm một trước khi chỉnh sửa csproj và về cơ bản kết thúc với hai liên kết đến nó, một liên kết và một solo.
Jeff Swensen

8
Một vấn đề với cách tiếp cận này là khi bạn xem qua tab "Xuất bản" trong thuộc tính dự án, sau đó nhấp vào nút "Tệp ứng dụng" ... bạn sẽ nhận thấy app.config, app.Debug.config, app.Release.config buộc phải được triển khai như một phần của quy trình Xuất bản. Chắc chắn, bạn cũng nhận được tệp MyApp.exe.config chính xác, nhưng tôi không muốn hành lý bổ sung đó được triển khai. Cần phải có một cách để giữ ứng dụng. *. Các tệp cấu hình trong dự án là <Không> thay vì <Nội dung>.
Lee Grissom

6
Một vấn đề mà điều này gây ra cho một số người là câu trả lời ban đầu được lấy từ Oleg Sych để lại một phần quan trọng. Nếu trong ứng dụng cá nhân của bạn (env) .configs bạn KHÔNG danh sách '<configuration xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform ">' và một cái gì đó như <appSettings xdt: Biến đổi = "Thay thế"> hoặc các thuộc tính thực hiện những điều tương tự trên các dòng cài đặt, nó sẽ không hoạt động. Thông tin cuối cùng này là chìa khóa và một khi tôi đã thêm nó, tất cả đều bắt đầu hoạt động.
djangojazz

24
Bạn có thể thay thế v10.0bằng v$(VisualStudioVersion)để đảm bảo dự án của bạn hoạt động với tất cả các phiên bản sau của VS.
Thibault D.

14
Tôi gặp lỗi MSBuild lỗi MSB3021: Không thể sao chép tệp. Không thể tìm thấy tệp 'obj \ Release \ ConsoleApp.exe' trong quá trình xây dựng. Vì vậy, tôi thay đổi một chút giải pháp để sử dụng lại mục tiêu <Target Name = "AfterBuild"> thay vì tạo một lượt thích mới trong giải pháp
asidis

137

Một giải pháp khác tôi đã tìm thấy là KHÔNG sử dụng các phép biến đổi mà chỉ có một tệp cấu hình riêng, ví dụ như app.Release.config. Sau đó thêm dòng này vào tệp csproj của bạn.

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

Điều này sẽ không chỉ tạo đúng tệp myprogram.exe.config mà nếu bạn đang sử dụng Cài đặt và triển khai dự án trong Visual Studio để tạo MSI, nó sẽ buộc dự án triển khai sử dụng tệp cấu hình chính xác khi đóng gói.


6
Những kỳ quan chưa được khám phá của MSBuild. Bây giờ tôi tự hỏi những gì khác là có thể. Btw. điều này cũng hoạt động đối với việc triển khai clickonce trực tiếp từ VS (ngược lại với câu trả lời được bình chọn cao hơn).
Boris B.

4
Các thay đổi có thể trở nên khó chịu và dễ bị lỗi nếu các cấu hình chứa nhiều mục nhập là CÙNG cho tất cả các bản dựng. Xử lý một vấn đề ngay bây giờ khi .config của một môi trường đã bỏ lỡ một thay đổi và tất nhiên đó là sản xuất.
xe jeepwran

1
Có hai bản sao của tệp cấu hình không phải là vấn đề, miễn là các nhà phát triển không phải là người duy trì thủ công.
anIBMer

1
Điều này là đẹp, làm việc như một nét duyên dáng! Tôi chỉ dán <AppConfig>App.Release.config</AppConfig>dòng bên trong <PropertyGroupđiều kiện hiện có cho Releasecấu hình và IDE hiển thị một dòng nguệch ngoạc bên dưới dòng <AppConfig>... nói rằng nó không có trong lược đồ hoặc cái gì đó, nhưng tôi đã lưu tệp bằng mọi cách và tải lại tệp dự án và xây dựng trong Releasecấu hình và nó đã làm việc!
Shiva

1
Với điều này, bạn sẽ mất chức năng của thiết kế cài đặt.
Ondřej

33

Theo kinh nghiệm của tôi, những thứ tôi cần để tạo môi trường cụ thể là những thứ như chuỗi kết nối, cài đặt ứng dụng và cài đặt smpt thường. Hệ thống cấu hình cho phép chỉ định những điều này trong các tệp riêng biệt. Vì vậy, bạn có thể sử dụng điều này trong app.config / web.config:

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

Những gì tôi thường làm là đặt các phần dành riêng cho cấu hình này trong các tệp riêng biệt, trong thư mục con có tên là ConfigFiles (trong thư mục gốc của giải pháp hoặc ở cấp độ dự án, tùy thuộc). Tôi xác định một tệp cho mỗi cấu hình, ví dụ: smtp.config.Debug và smtp.config.Release.

Sau đó, bạn có thể xác định một sự kiện xây dựng trước như vậy:

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

Trong quá trình phát triển nhóm, bạn có thể điều chỉnh điều này hơn nữa bằng cách bao gồm% COMPUTERNAME% và / hoặc% USERNAME% trong quy ước.

Tất nhiên, điều này ngụ ý rằng các tệp đích (x.config) KHÔNG nên được đặt trong kiểm soát nguồn (vì chúng được tạo). Bạn vẫn nên thêm chúng vào tệp dự án và đặt thuộc tính loại đầu ra của chúng thành 'sao chép luôn' hoặc 'sao chép nếu mới hơn'.

Đơn giản, có thể mở rộng và nó hoạt động cho tất cả các loại dự án Visual Studio (console, winforms, wpf, web).


Tôi có chính xác cấu hình tương tự mà bạn có. Nhưng tôi có vấn đề khi chuyển đổi tập tin smtp. Bạn có thể bao gồm các bản gốc và thông tin? Đây là của tôi: Tệp cơ sở: <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> Biến đổi:<?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

Tôi không chắc là tôi hiểu. Trong cấu hình này, tôi không chuyển đổi bất cứ thứ gì, nó chỉ sao chép các tệp ...
jeroenh

Ồ, tôi đã không thấy phần sao chép. Tôi chuyển đổi cấu hình thay vì chỉ sao chép nó. Dù sao cũng cảm ơn bạn.
jgarza

Tôi thích giải pháp này. Một gợi ý nhỏ: Trong ví dụ sao chép ở trên, các đối số nguồn và đích cho bản sao phải được bao quanh bởi dấu ngoặc kép; nếu không, Pre-Build sẽ thất bại đối với các thư mục có không gian trong tên của họ
vandre

32

Lấy cảm hứng từ Oleg và những người khác trong câu hỏi này, tôi đã đưa ra giải pháp https://stackoverflow.com/a/5109530/2286801 một bước nữa để kích hoạt tính năng sau.

  • Hoạt động với ClickOnce
  • Hoạt động với các dự án Thiết lập và Triển khai trong VS 2010
  • Hoạt động với VS2010, 2013, 2015 (không thử nghiệm 2012 mặc dù cũng hoạt động tốt).
  • Làm việc với Team Build. (Bạn phải cài đặt A) Visual Studio hoặc B) Microsoft.Web.Publishing.target và Microsoft.Web.Publishing.T Nhiệm.dll)

Giải pháp này hoạt động bằng cách thực hiện chuyển đổi app.config trước khi app.config được tham chiếu lần đầu tiên trong quy trình MSBuild. Nó sử dụng một tệp mục tiêu bên ngoài để quản lý dễ dàng hơn trên nhiều dự án.

Hướng dẫn:

Các bước tương tự với các giải pháp khác. Tôi đã trích dẫn những gì vẫn giữ nguyên và bao gồm nó để hoàn thiện và so sánh dễ dàng hơn.

0. Thêm một tệp mới vào dự án của bạn có tên là AppConfigTransatures.t Target

<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. Thêm một tệp XML cho mỗi cấu hình cho dự án.

Thông thường, bạn sẽ có cấu hình Gỡ lỗi và Phát hành, vì vậy hãy đặt tên cho tệp của bạn là App.Debug.config và App.Release.config. Trong dự án của tôi, tôi đã tạo một cấu hình cho từng loại môi trường để bạn có thể muốn thử nghiệm điều đó.

2. Dỡ bỏ dự án và mở tệp .csproj để chỉnh sửa

Visual Studio cho phép bạn chỉnh sửa .csproj ngay trong trình soạn thảo, bạn chỉ cần dỡ dự án trước. Sau đó nhấp chuột phải vào nó và chọn Chỉnh sửa .csproj.

3. Liên kết các tệp. *. Cấu hình thành App.config chính

Tìm phần tệp dự án chứa tất cả các tham chiếu App.config và App. *. Config và thay thế như sau. Bạn sẽ nhận thấy chúng tôi sử dụng Không thay vì Nội dung.

<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. Kích hoạt ma thuật biến đổi

Vào cuối tập tin sau

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

và trước trận chung kết

</Project>

chèn XML sau:

<Import Project="AppConfigTransformation.targets" />

Làm xong!


1
Đã thử trong RC Community 2015 RC và nó bỏ qua tệp app.Debug.config tôi có.
Khainestar

Tôi đã sử dụng thành công câu trả lời được chấp nhận trên một dự án WinForms .. nhưng vì một số lý do khó hiểu không thể áp dụng các câu trả lời được chấp nhận. cho một dự án WinForms khác (tất cả trong cùng một giải pháp). Câu trả lời này từ @bdeem là fave mới của tôi - vì nó tương thích chính xác với dự án MSI của tôi - cảm ơn rất nhiều!
bkwdesign

Điều này dường như không hoạt động trong VS 2015. Tôi đã cập nhật VisualStudioVersion từ 10 đến 12 nhưng không có xúc xắc. Có ý kiến ​​gì không?
Sina Architectural

@Sinaologists Bạn có thể cho chúng tôi biết thêm chi tiết? VS 2015 Ultimate, Cộng đồng, v.v. VB.NET, C #, có lỗi gì không?
bdeem

Doanh nghiệp VS2015. Không có lỗi gì. Nó không làm gì cả.
Sina thẩm mỹ

27

Bạn có thể sử dụng một tệp cấu hình riêng cho mỗi cấu hình, ví dụ: app.Debug.config, app.Release.config và sau đó sử dụng biến cấu hình trong tệp dự án của bạn:

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

Điều này sau đó sẽ tạo tệp ProjectName.exe.config chính xác tùy thuộc vào cấu hình bạn đang xây dựng.


Cảm ơn, tôi đã không sử dụng ví dụ chính xác của bạn để giải quyết vấn đề tôi gặp phải nhưng ví dụ của bạn đã khiến tôi suy nghĩ và đưa tôi đến một tâm hồn rất giống nhau khác bằng cách sử dụng tác vụ Sao chép.
jpierson

Đã thử điều này trong VS 2015 Community RC và nó được xây dựng, nhưng sau đó bỏ qua nội dung của ứng dụng. *. Config tôi đã thêm.
Khainestar

14

Tôi đã viết phần mở rộng đẹp để tự động chuyển đổi app.config giống như phần mở rộng được xây dựng trong Chuyển đổi cấu hình dự án ứng dụng web

Ưu điểm lớn nhất của tiện ích mở rộng này là bạn không cần cài đặt nó trên tất cả các máy xây dựng


1
Tiện ích mở rộng rất hữu ích, đặc biệt là hiện tại Slow Cheetah đang ở chế độ bảo trì và có thể không được hỗ trợ trong tương lai.
dthrasher

Vâng, mọi người nên dừng việc làm chậm cheetah như là giải pháp cho việc này khi chức năng này hiện được hỗ trợ bởi tác vụ msbuild biến đổi. Một kiến ​​trúc sư sw trong nhóm của tôi đã giới thiệu cheetah chậm một cách quá nhiệt tình cho dự án của chúng tôi và tạo ra các bản sửa lỗi, giai đoạn và phát hành các biến đổi của tất cả các cấu hình của chúng tôi, hầu hết không cần chuyển đổi. Không cần phải nói, khoảnh khắc anh ấy rời đi tôi đã kéo con báo chậm ra và bây giờ chúng tôi chỉ sử dụng một tác vụ biến đổi duy nhất trên web.config. Ahhhhh, đơn giản. Không phải nói rằng cheetah chậm không có thời gian và địa điểm của nó.
HarryT ink

5

Cài đặt "Công cụ chuyển đổi cấu hình" trong Visual Studio từ Marketplace và khởi động lại VS. Bạn cũng có thể thấy chuyển đổi xem trước trình đơn cho app.config.

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


1
Điều này hoạt động hoàn hảo và đòi hỏi rất ít nỗ lực hoặc suy nghĩ. Nhiều đánh giá cao. cảm ơn. ('chuyển đổi xem trước' không hoạt động, nhưng 'thêm các biến đổi' hoạt động hoàn hảo mà không gặp vấn đề gì với VS 2017). Cũng có vẻ để có được cập nhật thường xuyên.
adudley

1
cảm ơn bạn rất nhiều vì giải pháp, đằng sau hậu trường, nó thực hiện chính xác những gì Dan Abramov đã giải thích ở trên, mà không làm bẩn tay bạn
Mohammed Dawood Ansari

Đây là giải pháp cuối cùng. Bản xem trước dường như chỉ hoạt động tốt với VS 2019.
Kyle Champion

1
Tôi thích nó, nhưng thấy nó không hỗ trợ các tệp không phải app.config khác mà không chỉnh sửa csproj. Vẫn tuyệt vời để xem bản xem trước mặc dù.
Ian1971

4

Vì vậy, tôi đã kết thúc một cách tiếp cận hơi khác nhau. Tôi đã làm theo các bước của Dan qua bước 3, nhưng đã thêm một tệp khác: App.Base.Config. Tệp này chứa các cài đặt cấu hình bạn muốn trong mỗi App.Config được tạo. Sau đó, tôi sử dụng BeforeBuild (với sự bổ sung của Yuri vào TransformXml) để chuyển đổi cấu hình hiện tại với cấu hình Base thành App.config. Quá trình xây dựng sau đó sử dụng App.config đã chuyển đổi như bình thường. Tuy nhiên, một điều khó chịu là bạn muốn loại trừ App.config luôn thay đổi khỏi kiểm soát nguồn sau đó, nhưng các tệp cấu hình khác hiện phụ thuộc vào nó.

  <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

Chỉ cần một chút cải tiến cho giải pháp dường như được đăng ở mọi nơi bây giờ:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • nghĩa là, trừ khi bạn dự định ở lại với phiên bản VS hiện tại của bạn mãi mãi

Bạn có thể vui lòng giải thích bạn trả lời một chút hoặc cung cấp nguồn để giải thích nó?
roydukkey

4
Không giống như $(VisualStudioVersion)được đặt khi sử dụng MSBuild trực tiếp.
Jeremy Smith

Đây phải là một nhận xét cho stackoverflow.com/a/5109530/2003763 (Tôi vừa thêm thông tin tương tự như một nhận xét ở đó)
Thibault D.

2

Tôi đã tạo một giải pháp thay thế khác cho bài được đăng bởi Vishal Joshi trong đó yêu cầu thay đổi hành động xây dựng thành Nội dung được loại bỏ và cũng triển khai hỗ trợ cơ bản cho việc triển khai ClickOnce. Tôi nói cơ bản, vì tôi đã không kiểm tra kỹ lưỡng nhưng nó sẽ hoạt động trong kịch bản triển khai ClickOnce điển hình.

Giải pháp này bao gồm một dự án MSBuild duy nhất đã được nhập vào dự án ứng dụng windows tồn tại (* .csproj) mở rộng quy trình xây dựng để xem xét chuyển đổi app.config.

Bạn có thể đọc phần giải thích chi tiết hơn tại Visual Studio App.config XML Transform và tệp dự án MSBuild có thể được tải xuống từ GitHub .


1

Nếu bạn sử dụng TFS trực tuyến (phiên bản Đám mây) và bạn muốn chuyển đổi App.Config trong dự án, bạn có thể thực hiện các thao tác sau mà không cần cài đặt thêm bất kỳ công cụ nào. Từ VS => Dỡ bỏ dự án => Chỉnh sửa tệp dự án => Đi đến cuối tệp và thêm vào như sau:

<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" />

Hội đồng và Điểm đến hoạt động để sử dụng cục bộ và máy chủ TFS trực tuyến (Đám mây).


0

giải pháp đề xuất sẽ không hoạt động khi một thư viện lớp với tệp cấu hình được tham chiếu từ một dự án khác (trong trường hợp của tôi đó là thư viện dự án công nhân Azure). Nó sẽ không sao chép tập tin chuyển đổi chính xác từ objthư mục vào bin\##configuration-name##thư mục. Để làm cho nó hoạt động với những thay đổi tối thiểu, bạn cần thay đổi AfterCompilemục tiêu thành BeforeCompile:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.