app.config转换用于Visual Studio中不是Web项目的项目?
-
25-09-2019 - |
题
对于基于Visual Studio 2010 Web的应用程序,我们具有配置转换功能,通过该功能,我们可以维护不同环境的多个配置文件。但是,适用于Windows Services/Winforms或Console应用程序的App.Config文件不可用。
如下所示,有一个解决方法: 将XDT魔术应用于app.config.
但是,它并不简单,需要多个步骤。是否有一种更简单的方法可以为app.config文件实现相同的方法吗?
解决方案
现在,与本文处理的视觉工作室Addin一起使用: slowcheetah -Web.config转换语法现在为任何XML配置文件概括.
您可以右键单击Web.config,然后单击“添加配置变换”。当您这样做时,您将获得Web.debug.config和web.release.config。如果愿意,只要名称与配置配置文件对齐,就可以制作web.config。这些文件只是您想要的更改,而不是Web.config的完整副本。
您可能会认为您想使用XSLT来转换Web.config,但是尽管它们直观地感觉正确,但实际上是冗长的。
这是两个转换,一种使用XSLT,使用XML文档转换语法/名称空间相同的变换。与所有事物一样,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>
其他提示
我尝试了几种解决方案,这是我个人发现的最简单的解决方案。
担 在评论中指出 原始帖子 属于 Oleg Sych—谢谢,Oleg!
这是说明:
1.将每个配置的XML文件添加到项目中。
通常你会有 Debug
和 Release
配置,请命名您的文件 App.Debug.config
和 App.Release.config
. 。在我的项目中,我为每种环境创建了一个配置,因此您可能需要尝试一下。
2.卸载项目并打开.CSPROJ文件进行编辑
Visual Studio允许您编辑 .csproj 编辑器中的文件 - 您只需要先卸载项目即可。然后右键单击它,然后选择 编辑u003CProjectName>.csproj.
3.绑定应用程序。*。配置文件到main App.Config
查找包含全部的项目文件部分 App.config
和 App.*.config
参考。您会注意到他们的构建动作设置为 None
:
<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />
首先,为所有人设置构建行动 Content
.
接下来,全部 特定于配置 文件 依赖 在主 App.config
因此,Visual Studio像Designer和Code-Behind文件一样将它们分组。
将上面的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.激活转换魔术
在文件结尾之后
<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>
我发现的另一个解决方案是不使用转换,而只有一个单独的配置文件,例如app.release.config。然后将此行添加到您的CSPROJ文件中。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AppConfig>App.Release.config</AppConfig>
</PropertyGroup>
这不仅将生成正确的myProgram.exe.config文件,而且如果您在Visual Studio中使用设置和部署项目来生成MSI,它将迫使部署项目在打包时使用正确的配置文件。
根据我的经验,我需要使环境特定的事情是连接字符串,应用程序设置和经常设置设置之类的东西。配置系统允许在单独的文件中指定这些内容。因此,您可以在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%和/或%用户名%进行进一步调整。
当然,这意味着目标文件(X.Config)不应将其放置在源控制中(因为它们是生成的)。您仍然应该将它们添加到项目文件中,并将其输出类型属性设置为“始终复制”或“复制”,如果更新”。
简单,可扩展,并且适用于所有类型的Visual Studio项目(控制台,Winforms,WPF,Web)。
受到启发 Oleg 还有其他问题,我采用了解决方案 https://stackoverflow.com/a/5109530/2286801 进一步启用以下内容。
- 使用ClickOnce
- 在VS 2010中使用设置和部署项目
- 与VS2010、2013、2015的VS2010合作(尽管也应该工作,但未测试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.绑定应用程序。*。配置文件到main App.Config
查找包含所有app.config和app的项目文件部分。*。配置引用,然后替换如下。您会注意到我们没有使用而不是内容。
<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" />
完毕!
您可以每个配置使用单独的配置文件,例如app.debug.config,app.release.config,然后在项目文件中使用配置变量:
<PropertyGroup>
<AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>
然后,这将根据您正在构建的配置而创建正确的projectName.exe.config文件。
我写了不错的扩展名来自动化app.config转换,就像内置的Web应用程序项目一样 配置变换
该扩展程序的最大优点是您不需要在所有构建机器上安装它
因此,我最终采取了略有不同的方法。我遵循DAN的步骤贯穿步骤3,但添加了另一个文件:app.base.config。该文件包含您在每个生成的app.config中所需的配置设置。然后,我将Forter Build(与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>
从MarketPlace中安装“配置转换工具”并重新启动VS。您也可以看到app.config的菜单预览变换。
https://marketplace.visualstudio.com/items?itemname=golanavraham.configurationTransform
我用这个工具解决了这个问题 http://ctt.codeplex.com/. 。我将其与CCNET/NANT脚本一起制作包装。
对目前无处不在的解决方案的改进只是一点点改进:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
- 也就是说,除非您打算永远留在当前的VS版本中
我已经为Vishal Joshi发布的替代方案创建了另一种选择 内容 被删除并为ClickOnce部署提供了基本支持。我说基本,因为我没有彻底测试它,但是它应该在典型的ClickOnce部署方案中起作用。
该解决方案由一个单一的MSBUILD项目组成,该项目曾经导入到存在的Windows应用程序项目(*.CSPROJ)将构建过程扩展到考虑App.Config转换。
您可以在 Visual Studio App.Config XML转换 MSBuild项目文件可以是 从Github下载.
如果您使用TFS Online(云版本),并且想在项目中转换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 Online(Cloud)服务器。
当从另一个项目中引用带有配置文件的类库时,建议的解决方案将不起作用(在我的情况下是Azure Works项目库)。它不会从 obj
文件夹进入 bin\##configuration-name##
文件夹。为了使其与最小的更改一起使用,您需要更改 AfterCompile
目标 BeforeCompile
:
<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">