2010-05-28 57 views
20

由于VS2010的要求web.config包含在项目中,我们如何允许每个人保留自己的自定义配置文件而不会陷入源代码管理问题?在VS2010和TFS中为团队管理web.config

以前,我们只是将web.config放在我们的项目之外,允许每个人在他们的机器上保留自己的web.config版本。我们转移到VS2010,它现在迫使我添加web.config到我的项目,以运行调试模式。由于我们的项目与TFS相关联,因此它会自动将web.config添加到源代码管理并尝试以此方式进行维护。

有没有一种方法可以在调试模式下运行,而无需在项目中包含web.config?还是有更好的方法来管理配置文件?

+1

只是好奇,web.config中的哪些信息在开发者之间有所不同? – itchi 2010-05-30 03:55:42

+1

@itchi:从数据库连接到任何Web服务绑定,应用程序设置,授权等都可能有很多事情......可能是我无法想象的许多事情。 – 2012-06-21 14:11:09

+0

下面是一个快速解决方案(VS中的一步),但它确实将责任交给开发人员来“监视”更改。您可以根据需要将该文件保留在项目中。基本上你告诉TFS不要通过使用“Cloak”来获取/检出/检查此特定文件:http://stackoverflow.com/questions/9741975/how-can-i-always-block-checkin-of-a- specific-file-in-tfs – Jonno 2012-10-03 01:42:13

回答

1

贾勒特,

所有我拥有的是我们如何处理这种情况的轶事。

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

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

我不确定你使用的是什么源代码控制,但是使用Tortoise SVN(在Visual Studio之外运行)颠覆了我们的小团队。我们大多数人在两台独立的机器上进行编程......一个在办公室,一个在家......所以当你将它与我们有两台生产服务器的事实相结合时,我们可以轻松处理10个web.config的每个项目。

这样说的话,你必须记得当你安装一个新的开发计算机时要带上另一个开发者的web.config文件,否则解决方案将不能正确加载,或者设置一个默认的web.config,它不包含适当的连接字符串和应用设置。

而且最后要注意的:我们正在使用IIS 7调试

+0

不幸的是,我们在这里使用的是TFS2010,所以它没有SVN的灵活性。我希望它具有忽略单个文件的简单能力。 – Jaeell 2010-06-01 13:10:10

+0

Jarret,我认为我的建议可能不完全相关,只是认为我会分享我的经验 – 2010-06-01 14:34:35

1

SO有这个here一个很好的答案。我还没有签出在VS2010多web.configs,但我不知道这是否加入,因为他们对web所做的更改。

+0

是的,我研究了这一点,而这将工作时,移动到不同的服务器。但是,我不想检查每个开发人员的web.config版本(以及不得不创建不同的构建配置文件),所以我希望完全避免签入。 – Jaeell 2010-06-01 13:01:01

1

我已经使用T4模板来解决这个问题。而不是有一个web.config,你有一个web.tt,它会生成一个web.config。在web.tt文件中,您可以根据机器名或当前用户生成不同的代码。

+0

我很高兴如果你能指出一些资源来做这件事,我听到很多,但从来没有用过T4 Templates – TJB 2011-10-21 23:59:08

+0

好好玩,够公平的。我会看到你的链接,并给你一些自动化; )http://letmebingthatforyou.com/?q=t4%20template – TJB 2011-10-24 20:47:33

3

我还没有看到一个很好的答案,以管理每个开发人员与TFS迄今为止不同的web.config文件。

但是,如果解决导致开发人员需要不同web.config文件的问题,则无论选择何种版本控制系统,这通常都会带来更好的结果。例如,开发人员环境之间差异较小将减少Works On My Machine(WOMM)参数,并且通常还会减少开发之外的环境(例如测试,生产)的配置更改,从而简化了部署并减少了恼人的环境 - 特定于配置的错误。

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

+0

我完全同意这里。 – NotMe 2011-01-28 20:27:08

32

我希望这可以帮助别人。我在过去的几个月里已经使用了这种方法。这很容易做到。我使用VS 2010与2010 TFS让我们来分析一下:

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

这里是它是如何做:

  1. 右键单击要做到这一点,并选择“卸载项目”(而不是“删除项目”)的Web项目。

  2. 再次右键单击相同的Web项目(现在应该变为灰色)并选择“编辑... csproj”。这将在Xml编辑器中打开该项目。

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

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

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

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

  7. 现在,我们将创建一个新的Build文件,它将帮助我们重新生成任何内置类型的Web.config,甚至是调试类型(这正是Web.config转换所缺乏的)。在您的项目中创建一个新的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. 现在让我们来看看项目的样子。再次右键单击该项目并“卸载”它。现在,再次右键单击并“编辑”它。现在回过头去取消我们在步骤#3中注释过的所有元素。另外,您还应该在“Web.base.config”元素下添加“DependentOn”元素,以便它将显示在“Web.config”下。关闭并保存它,然后重新加载您的项目。你应该注意到所有的配置现在都在“Web.config”中。

  11. 此时,您可以根据需要为您的项目/解决方案添加尽可能多的配置。例如,我添加了一个名为“Tim(Debug)”的构建配置,但项目配置称为“Tim.Debug”。当我右击“Web.config”并选择“添加配置变换”时,它现在添加了我的“Web.Tim.Debug.config”文件。您还可以为每个环境或每个团队添加配置。


值得一提的是您的个性化配置文件只是一个子集“Web.base.config”,并在任何构建过程中,他们将被“转化”。要在调试过程中切换要构建的Transform,只需转到解决方案的顶部,然后选择所需的Build Config。只要您具有该构建配置的web.config,它就会转变。如果没有,你会得到“Web.base.config”。

注意:这也应该与标准的Windows/WPF应用程序以及使用“app.config”代替。

+0

这绝对是真棒。如果没有Web.Configuration.config,我做了一次更改,以免发生错误:''。我们应该注意到,每个开发人员都必须在自己的“配置”中进行构建。我希望有一个可靠的方法来在项目中包含一个“machine.config”,而不需要经常试图检查它。 – 2012-02-01 03:36:42

+0

+1这正是我想要做自己的方式。所以我搜索了这里。伟大的工作蒂姆。 – 2012-06-21 14:25:26

+0

**还有一个Q **:因为您已经使用过这些MS构建目标,所以您可能知道要添加什么来转换其他配置文件? Web配置允许appSettings在不同的配置文件中定义,即* appSettings.config *。我们如何将它添加到转换中(取决于应该手动编辑这些转换以分层显示,但这不是问题)。 – 2012-06-21 14:32:00

相关问题