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

发布于 2024-09-13 11:49:30 字数 531 浏览 6 评论 0原文

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

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

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

In the team I'm working in we have a big product with many WCF web services and some web sites which use the services. We are just about to upgrade to VS 2010 and I'm looking at if we should start using the new config transform functions in VS 2010.

We have several different environments which need different web.configs (database connection strings, WCF addresses and so on). Often when debugging something high up such as the web frontend it is useful to configure it to directly connect with the TEST or QA backend / databases. On each developer's local machine the IIS is configured directly to the source folder of each WCF/web project, and when running locally it is a simple matter of Ctrl-Shift-B or F5 to debug something.
One would think that it would be possible to build/F5 with TEST or QA as configuration mode and get the TEST/QA config, but I don't see how. Is it not supported, or maybe we need to change how we work with things?

Our other option is to instead use a simple replace-script as a prebuild event that creates the web.config from a template and a key-file depending on configuration mode. With this method you would get TEST config if you compile in TEST and so on but it feels a bit bad to roll our own solution when there is a function built into Visual Studio.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

难忘№最初的完美 2024-09-20 11:49:30

您可以使用 .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 。转换完成后,我们使用复制任务获取转换后的文件并将其复制到 Web 根目录中的 web.config 文件。我偶尔遇到的一个问题是在转换完成后尝试覆盖 web.config 时出现文件使用错误。在 MSBuild 任务解决该问题后添加睡眠任务(来自 MSBuildCommunityTasks)。

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

FirstRun 的想法来自于帖子

You can achieve the effect you're looking for by using the BeforeBuild and AfterBuild targets available in the .csproj file. The VS.NET IDE will execute these targets when doing a Build or a Rebuild, so you can use them to execute the web.config transforms. Since you'll need to do a web.config transform and then overwrite the actual web.config file, you'll need to rely on a new file called web.default.config to store the base web.config data.

I tried this out in a test project, here were the changes I made to the .csproj file:

<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>

I had to manually add these to the .csproj file (I used Notepad++). As far as I can tell there is no way to add these instructions through the VS.NET IDE. You need to supply the conditional on the AfterBuild to keep from having a circular reference, as the call to MSBuild will rerun the build to generate the web.config transform.

Basically what we're doing is copying the web.default.config file (our base template) over the existing web.config before we start to build, and then we use MSBuild to generate a web.config for whatever configuration we're building. After the transform is complete, we use a Copy task to take the transformed file and copy it over to the web.config file in the web root. One issue I occasionally ran into was a file in use error when trying to overwrite the web.config after the transform was complete. Adding a Sleep task (from MSBuildCommunityTasks) after the MSBuild task took care of that issue.

I only tested this approach using the built in ASP.NET server, not IIS, so YMMV but I feel like this is a workable solution.

The FirstRun idea came from this post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文