【问题标题】:Visual Studio: differentiate app.config for debug and release modeVisual Studio:区分 app.config 以用于调试和发布模式
【发布时间】:2010-11-20 16:44:03
【问题描述】:

有没有办法在发布模式下构建时自动使用单独的 app.config?

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

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

【问题讨论】:

    标签: visual-studio app-config production-environment


    【解决方案1】:

    通过上下文菜单在解决方案资源管理器中卸载项目。

    通过上下文菜单编辑.csproj文件并添加:

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

    【讨论】:

    • 虽然 intellisense 不会将 appconfig 显示为有效属性。其作品。我认为它在开发的最后阶段最有用,此时 app.config 文件中不需要进行更多重大更改。谢谢
    【解决方案2】:

    我最近发布了对类似 SO 主题的极其迟来的回复: https://stackoverflow.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)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 2019-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多