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 必须替换为上面演练中 &lt;Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.targets" /&gt; 中的 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.configApp.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.configApp.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动态库文件的配置方法

导航栏在 Visual Studio 2017 中区分大小写

请问Visual Studio Code(不是Visual Studio)怎么设置文件关联。