Visual Studio:区分 app.config 以用于调试和发布模式
Posted
技术标签:
【中文标题】Visual Studio:区分 app.config 以用于调试和发布模式【英文标题】:Visual Studio: differentiate app.config for debug and release mode 【发布时间】:2010-11-20 16:44:03 【问题描述】:有没有办法在发布模式下构建时自动使用单独的 app.config?
换句话说,我想用一个 app.config 进行测试,然后用另一个发布。
目前,我保留一个名为 app.config.production 的单独副本,并在构建发布后手动覆盖 bin\Release\Application.exe.config。
【问题讨论】:
【参考方案1】:通过上下文菜单在解决方案资源管理器中卸载项目。
通过上下文菜单编辑.csproj
文件并添加:
<PropertyGroup>
<AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>
【讨论】:
虽然 intellisense 不会将 appconfig 显示为有效属性。其作品。我认为它在开发的最后阶段最有用,此时 app.config 文件中不需要进行更多重大更改。谢谢【参考方案2】:我最近发布了对类似 SO 主题的极其迟来的回复: https://***.com/a/27546685/2798367
为了清楚起见,我将在这里重复一遍:
这有点晚了,但我偶然发现了一种为app.config
文件实现web.transform
方法的好方法。 (即它使用命名空间http://schemas.microsoft.com/XML-Document-Transform
)
我认为它“不错”,因为它是一种纯 xml 方法,不需要 3rd 方软件。
根据您的各种构建配置,父/默认 App.config 文件来自。
然后这些后代只会覆盖他们需要的东西。
在我看来,这比维护x
的配置文件数量要复杂和强大得多,这些配置文件会被完整复制,例如在其他答案中。
演练已在此处发布:http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/
妈妈,看,我的 IDE 中没有明确的构建后事件!
【讨论】:
对于 VS 2017,v10.0
必须替换为上面演练中 <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.targets" />
中的 v15.0
。【参考方案3】:
一种简单快捷的方法是创建第二个文件“App.release.config”并插入此预构建事件:
IF $(ConfigurationName) == Release COPY /Y "$(ProjectDir)App.config" "$(ProjectDir)App.debug.config"
IF $(ConfigurationName) == Release COPY /Y "$(ProjectDir)App.release.config" "$(ProjectDir)App.config"
还有这个后期构建事件:
IF $(ConfigurationName) == Release COPY /Y "$(ProjectDir)App.debug.config" "$(ProjectDir)App.config"
这可能有点奇怪,但它允许您继续使用.Settings
文件作为调试设置,这些设置仍然链接到App.config
。 App.release.config
必须手动构建,但切换此功能非常容易。
【讨论】:
你在哪里添加这些构建事件? @Adrian 在解决方案中右键单击您的项目,单击“属性”并打开“构建事件”的点击 我真的很喜欢这个,简单有效,不依赖于随时间变化的 msbuild 魔法。【参考方案4】:我强烈推荐将 SlowCheetah 用于 app.config 转换。在这里访问这个 nuget gem Visual Studio Gallery
【讨论】:
旁注:SlowCheetah 仅在您发布作品时有效,在调试时无效。 不再是这样了 不错!我希望这种变化很快就会发生。 SlowCheetah 是比 Pre build / Post build 脚本更好的解决方案。【参考方案5】:与最佳答案类似,但如果使用这种方法,您可以看到实际文件,如果喜欢的话,并且智能感知不会在 csproj 文件中抱怨:
<Target Name="SetAppConfig" BeforeTargets="Compile">
<Copy SourceFiles="debug.config" DestinationFiles="app.config" OverwriteReadOnlyFiles="true" Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " />
<Copy SourceFiles="release.config" DestinationFiles="app.config" OverwriteReadOnlyFiles="true" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
</Target>
【讨论】:
【参考方案6】:一个干净的解决方案是将2个文件App.Debug.config
和App.Release.config
组合成App.config
,并根据编译时的配置将好的文件更改为App.config
:
<ItemGroup>
<None Include="App.config" />
<None Include="App.Debug.config">
<DependentUpon>App.config</DependentUpon>
</None>
<None Include="App.Release.config">
<DependentUpon>App.config</DependentUpon>
</None>
</ItemGroup>
<Target Name="SetAppConfig" BeforeTargets="Compile">
<Copy SourceFiles="App.Debug.config" DestinationFiles="App.config" OverwriteReadOnlyFiles="true" Condition=" '$(Configuration)' == 'Debug' " />
<Copy SourceFiles="App.Release.config" DestinationFiles="App.config" OverwriteReadOnlyFiles="true" Condition=" '$(Configuration)' == 'Release' " />
</Target>
使用此解决方案,您将在 Visual Studio 中得到类似的结果:
【讨论】:
【参考方案7】:我不知道这是否有帮助,但 app.config 会识别标准的 MSBUILD 替换字符串,例如 $(Configuration)。
【讨论】:
以上是关于Visual Studio:区分 app.config 以用于调试和发布模式的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio:区分 app.config 以用于调试和发布模式
用于区分 Visual Studio 2012 和 2010 的 C# 预处理器指令或条件?
区分 cl.exe 生成的 32 位和 64 位 PE 对象文件(Visual Studio C++)
Visual Studio中根据系统区分引用64位32位DLL动态库文件的配置方法