在本地运行/调试时如何使用 Visual Studio 2010 配置转换?

Posted

技术标签:

【中文标题】在本地运行/调试时如何使用 Visual Studio 2010 配置转换?【英文标题】:How to use Visual Studio 2010 config transform when running/debugging locally? 【发布时间】:2011-03-26 05:41:22 【问题描述】:

在我工作的团队中,我们有一个包含许多 WCF Web 服务和一些使用这些服务的网站的大型产品。我们即将升级到 VS 2010,我正在考虑是否应该开始使用 VS 2010 中的新配置转换功能。

我们有几个不同的环境,需要不同的 web.config(数据库连接字符串、WCF 地址等)。通常在调试诸如 Web 前端之类的高级内容时,将其配置为直接连接 TEST 或 QA 后端/数据库很有用。在每个开发人员的本地计算机上,IIS 直接配置到每个 WCF/web 项目的源文件夹,当在本地运行时,只需 Ctrl-Shift-B 或 F5 即可进行调试。 有人会认为可以使用 TEST 或 QA 作为配置模式构建/F5 并获得 TEST/QA 配置,但我不知道如何。是否不受支持,或者我们可能需要改变我们处理事物的方式?

我们的另一个选择是使用简单的替换脚本作为预构建事件,根据配置模式从模板和密钥文件创建 web.config。使用这种方法,如果您在 TEST 等中编译,您将获得 TEST 配置,但是当 Visual Studio 中内置了一个函数时,推出我们自己的解决方案感觉有点糟糕。

【问题讨论】:

【参考方案1】:

您可以使用 .csproj 文件中提供的 BeforeBuild 和 AfterBuild 目标来实现您正在寻找的效果。 VS.NET IDE 将在构建或重建时执行这些目标,因此您可以使用它们来执行 web.config 转换。由于您需要进行 web.config 转换,然后覆盖实际的 web.config 文件,因此您需要依赖名为 web.default.config 的新文件来存储基本 web.config 数据。

我在一个测试项目中对此进行了尝试,以下是我对 .csproj 文件所做的更改:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<ProjectExtensions>
...
</ProjectExtensions>
<Target Name="BeforeBuild">
    <Copy SourceFiles="$(ProjectDir)web.default.config" DestinationFiles="$(ProjectDir)web.config" />
</Target>
<Target Name="AfterBuild" Condition="$(FirstRun) != 'false'">
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="TransformWebConfig" Properties="FirstRun=false;" />
    <Sleep Milliseconds="2000" />
    <Copy SourceFiles="$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\transformed\web.config"
        DestinationFiles="$(ProjectDir)web.config" />
</Target>

我必须手动将这些添加到 .csproj 文件中(我使用的是 Notepad++)。据我所知,没有办法通过 VS.NET IDE 添加这些指令。您需要在 AfterBuild 上提供条件以避免循环引用,因为对 MSBuild 的调用将重新运行构建以生成 web.config 转换。

我们所做的基本上是在开始构建之前将 web.default.config 文件(我们的基本模板)复制到现有的 web.config 上,然后我们使用 MSBuild 为我们的任何配置生成 web.config '正在建设。转换完成后,我们使用 Copy 任务获取转换后的文件并将其复制到 Web 根目录下的 web.config 文件中。我偶尔遇到的一个问题是在转换完成后尝试覆盖 web.config 时出现文件正在使用错误。在 MSBuild 任务解决该问题后添加睡眠任务(来自 MSBuildCommunityTasks)。

我只使用内置的 ASP.NET 服务器而不是 IIS 测试了这种方法,所以 YMMV 但我觉得这是一个可行的解决方案。

FirstRun 的想法来自这个post。

【讨论】:

我已将此答案标记为已接受,因为它似乎解决了问题(即使我没有测试过)。谢谢。最后,我们使用了我在上一段中编写的自定义 postbuild 事件,小型 powershell 脚本从模板创建 web.config,该模板使用 configurationName 来决定如何替换。 @viblo 谢谢。我不确定我是否会使用我概述的方法,因为它是一种 hackish,但我更好奇它是否可以完成。不管怎样,好问题。 @rsbarro 首先感谢您的干净回答。但是,我仍然遇到同样的问题“文件正在使用错误”。甚至我也添加了 。你还有什么建议吗?谢谢 @curiousBoy 这是一个网络项目吗?是否在 IIS 下运行? @rsbarro 是的,这是一个网络项目。是的,它在 IIS 下运行

以上是关于在本地运行/调试时如何使用 Visual Studio 2010 配置转换?的主要内容,如果未能解决你的问题,请参考以下文章

尝试连接到运行 IISExpress 的本地主机时如何解决 ERR_CONNECTION_REFUSED - 错误 502(无法从 Visual Studio 调试)?

visual studio 2012如何调试和运行程序?

如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?

如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?

译如何在 Visual Studio 中调试异步代码

用visual studio 2017来调试python