Visual Studio:区分调试和发布模式的app.config

63

在发布模式下,是否有自动使用单独的app.config的方法?

换句话说,我想用一个app.config进行测试,用另一个发布。

目前,我保留了一个名为app.config.production的副本,并在发布构建后手动覆盖bin\Release\Application.exe.config。

7个回答

51
通过上下文菜单在解决方案资源管理器中卸载该项目。 通过上下文菜单编辑 .csproj 文件,添加如下内容:
<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

1
尽管Intellisense不将appconfig显示为有效属性,但它确实起作用。我认为它在开发的最后阶段最有用,当应用程序配置文件中不再需要进行重大更改时。谢谢。 - antonio
这甚至适用于.NET 7。非常感谢! - Uwe Keim
这甚至适用于.NET 7。非常感谢! - undefined

20

最近我在类似的SO话题上发布了一个超级迟到的回复: https://dev59.com/FHA75IYBdhLWcg3w0cnx#27546685

为了便于理解,我会在这里重复一遍:

我发现了一种实现app.config文件的web.transform方法的好方法。(即它利用了命名空间http://schemas.microsoft.com/XML-Document-Transform)

我认为它很“好”是因为它是一种纯xml方法,不需要第三方软件。

一个父/App.config文件会根据不同的构建配置进行修改。 然后这些子配置只覆盖需要修改的地方。 在我看来,这比其他答案中需要维护x个完整的配置文件要更加复杂和健壮。

可以在这里找到一篇操作指南:http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


看,妈妈——我的IDE没有显式的后期构建事件!


2
对于VS 2017,在上述步骤中,必须将<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />中的v10.0替换为v15.0 - Jean-François Beauchamp
我正在使用带有 .net 6 web api 的 Visual Studio 2022,但这个解决方案无效。 - Darth Scitus
应将 v10.0 替换为 v$(VisualStudioVersion),以使此解决方案与任何 VS 版本兼容。 - OronDF343

17

一种简洁的解决方案是将两个文件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中您将获得类似于以下截图的效果:

screenshot


但是这个解决方案只是用调试或发布版本覆盖了App.config,如果您为两者共享设置,仍然需要在两个配置文件中维护它们,以免被删除。 - IronHide

10

一种简单快捷的方式是创建一个名为 "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
2
@Adrian 在你的解决方案中右键单击项目,点击“属性”,然后打开“生成事件”选项卡。 - Martin Braun
1
我真的很喜欢这个,它简单而有效,不依赖于随时间变化的msbuild魔法。 - rollsch

9

我强烈推荐使用SlowCheetah进行app.config转换。在Visual Studio Gallery中可以找到这个NuGet宝石。


附注:SlowCheetah 只在发布作品时起作用,而不是在调试时。 - Rudy Hinojosa
1
那不再是事实了。 - user585968
2
不错!我一直希望这个变化很快就会到来。 - Rudy Hinojosa
1
SlowCheetah比预构建/后构建脚本更好的解决方案。 - Sunny Tambi
1
还支持VS 2022!https://github.com/Microsoft/slow-cheetah https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms-VS2022&ssr=false#overview - Nathan Prather

5

与顶部答案类似,但是使用这种方法,如果需要,您可以查看实际文件,Intellisense在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>

1

我不确定这是否有帮助,但是app.config会识别标准的MSBUILD替换字符串,例如$(Configuration)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接