为VS2010中的团队管理web.config& TFS

时间:2010-05-28 19:55:55

标签: asp.net visual-studio-2010 tfs web-config

由于VS2010要求web.config包含在项目中,我们如何让每个人保留自己的自定义配置文件而不会遇到源代码控制问题?

以前,我们只是将web.config从我们的项目中删除,允许每个人在他们的机器上保留自己的本地版本的web.config。我们搬到了VS2010,现在它迫使我将web.config添加到我的项目中以运行调试模式。因为我们的项目链接到TFS,它会自动将web.config添加到源代码控制并尝试以这种方式进行维护。

有没有办法在调试模式下运行而不在项目中包含web.config?或者有更好的方法来管理配置文件吗?

5 个答案:

答案 0 :(得分:32)

我希望这有助于某人。我过去几个月已经使用过这种方法。这很容易做到。我正在使用VS 2010和TFS 2010.让我们分解一下:

  • 所有网络配置文件现在都是“DependentOn”“web.config”
  • 每个开发人员或团队都需要自己的“[User / Team] .Debug.config”
  • 无论我们是否在发布模式下“发布”,都应该转换配置文件。

以下是它的完成方式:

  1. 右键单击要执行此操作的Web项目,然后选择“卸载项目”(而不是“删除项目”)。

  2. 再次右键单击同一个Web项目(现在应该显示为灰色),然后选择“编辑... csproj”。这将在Xml编辑器中打开项目。

  3. 向下滚动,直到找到包含所有“Web.config”列表的部分。现在,注释掉Xml中的所有“DependentUpon”元素。

  4. 关闭Xml编辑器并保存更改。接下来,再次右键单击您的项目,然后选择“重新加载”。当项目重新加载时,您会注意到Web.configs不再“堆叠”在“Web.config”下。这对于“欺骗”TFS是必要的。

  5. 现在,复制“Web.config”文件,将其粘贴到同一个项目中,并将其重命名为“Web.base.config”。这将用于每次重新生成Web.config(下面介绍)。

  6. 现在,选择Web.config文件并转到“文件 - >源代码管理 - >从源代码管理中排除Web.config”。此外,打开源代码管理资源管理器(TFS资源管​​理器视图)并找到Web.config所在的位置,并从TFS中删除它。这样做是因为每次构建项目时都会重新生成Web.config(我将在下面介绍)。

  7. 现在,我们将创建一个新的Build文件,它将帮助我们为任何Built Type重新生成Web.config,甚至是Debug类(这是Web.config Transformed所缺少的)。在项目中创建一个新的Xml文件,并将其重命名为“[YourProjectName] .wpp.targets”。重要的是要确切地命名您的项目,包括所有点,破折号等(例如My.Project.wpp.targets)。

  8. 现在,在新文件中输入以下Xml。如果它开始强调语法错误,请不要担心:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <UsingTask TaskName="TransformXml"
                   AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
    
        <!-- Make sure web.config will be there even for package/publish -->
        <Target Name="CopyWebConfig" BeforeTargets="Build;Rebuild">
            <Copy SourceFiles="Web.base.config"
                  DestinationFiles="Web.config"
                  OverwriteReadOnlyFiles="true"
                  SkipUnchangedFiles="false" />
        </Target>
    
        <Target Name="CustomTarget" BeforeTargets="BeforeBuild">
            <Message Text="Transforming: Web.$(Configuration).config" Importance="high" />
            <TransformXml Source="Web.base.config"
                          Transform="Web.$(Configuration).config"
                          Destination="Web.config" />
        </Target>
    </Project>
    
  9. 现在,从现在开始,你永远不要编辑Web.config,每次应用程序编译时都会被覆盖。您只需编辑“Web.base.config”。

  10. 现在,让我们让Project看起来像它。再次右键单击Project并“卸载”它。现在,再次右键单击并“编辑”它。现在,返回并取消评论我们在步骤#3中注释掉的所有元素。此外,您应该在“Web.base.config”元素下添加“DependentOn”元素,以便它也将显示在“Web.config”下。关闭并保存,然后重新加载项目。您应该注意到所有配置现在再次位于“Web.config”下。

  11. 此时,您可以根据需要为项目/解决方案添加任意数量的配置。例如,我添加了一个名为“Tim(Debug)”的Build Config,但Project配置名为“Tim.Debug”。当我右键单击“Web.config”并选择“添加配置转换”时,它现在添加了我的“Web.Tim.Debug.config”文件。您还可以为每个环境或每个团队添加配置。


  12. 值得注意的是,您的个人配置文件只是“Web.base.config”的子集,并且在任何构建过程中它们都将被“转换”。要在调试期间切换要构建的Transform,只需转到解决方案的顶部并选择所需的Build Config。只要您拥有该Build Config的web.config,它就会转换。如果没有,你将获得“Web.base.config”。

    注意:这也适用于标准的Windows / WPF应用程序以及“app.config”。

答案 1 :(得分:3)

到目前为止,我还没有看到每个开发人员使用TFS管理不同web.config文件的好答案。

但是,如果解决了导致开发人员需要不同web.config文件的问题,那么无论选择何种版本控制系统,都会产生更好的结果。

例如,开发人员环境之间的差异会减少Works On My Machine(WOMM)参数,并且通常还会减少开发之外的环境(例如测试,生产)的配置更改,从而简化部署并减少烦人的环境配置特定的错误。

根据配置项的性质,通常有几种不同的策略可以缓解每个环境的差异。其中许多我怀疑已经有Stack Overflow的答案。

答案 2 :(得分:1)

Jarrett的,

我所拥有的只是一个关于我们如何处理这种情况的轶事。

我们有一个由4名程序员组成的团队。

我们在VS-TortoiseSVN之外使用源控制解​​决方案。我们每个人都维护着我们自己的本地web.config,它包含在项目中。项目文件包含在存储库中,但我们将web.config设置为“提交时忽略”状态。

我不确定您使用的源代码控制是什么,但使用Tortoise SVN(在Visual Studio之外运行)的颠覆对我们的小团队来说非常有用。我们大多数人在两台独立的机器上进行编程......一台在办公室,一台在家里......所以当你把它与我们有两个生产服务器的事实联系在一起时,我们很容易处理每个项目10个web.config。 / p>

说到这一点,你必须记住在设置新的开发计算机时带来另一个开发人员的web.config文件,否则解决方案将无法正确加载,或者设置一个默认的web.config,它不包含适当的连接字符串和应用设置。

最后一点:我们正在使用IIS 7进行调试

答案 3 :(得分:1)

SO有一个很好的答案here ..我还没有检查VS2010中的多个web.configs,但我想知道是否因为他们对web.conig所做的更改而添加了它。

答案 4 :(得分:1)

我使用过T4模板来解决这个问题。您没有web.config,而是使用web.tt生成web.config。在web.tt文件中,您可以根据machinename或当前用户生成不同的代码。