在 VS2010 和 TFS 中管理团队的 web.config
Posted
技术标签:
【中文标题】在 VS2010 和 TFS 中管理团队的 web.config【英文标题】:Managing web.config for teams in VS2010 & TFS 【发布时间】:2011-02-25 07:11:49 【问题描述】:由于 VS2010 要求将 web.config 包含在项目中,我们如何让每个人都保留自己的自定义配置文件而不会遇到源代码控制问题?
以前,我们只是将 web.config 排除在我们的项目之外,让每个人都可以在他们的机器上保留自己的本地版本的 web.config。我们搬到了 VS2010,现在它迫使我将 web.config 添加到我的项目中以运行调试模式。因为我们的项目链接到 TFS,它会自动将 web.config 添加到源代码管理并尝试以这种方式维护它。
有没有办法在调试模式下运行而不在项目中包含 web.config?或者有没有更好的方法来管理配置文件?
【问题讨论】:
只是好奇,web.config中的哪些信息在开发者之间有什么不同? @itchi:从数据库连接到任何 Web 服务绑定、应用程序设置、授权等,可能有很多东西......可能有很多我无法想象的东西。 这是一个快速修复(VS 中的一个步骤),但它确实让开发人员有责任“监控”更改。该文件根据您的需要留在项目中。基本上,您告诉 TFS 不要使用“Cloak”获取/签出/签入此特定文件:***.com/questions/9741975/… 【参考方案1】:我希望这对某人有所帮助。在过去的几个月里,我一直在使用这种方法。这真的很容易做到。我正在使用 VS 2010 和 TFS 2010。让我们分解一下:
所有 Web 配置文件现在都是“DependentOn”“web.config” 每个开发人员或团队都需要自己的“[User/Team].Debug.config” 无论我们是否在发布模式下“发布”,都应该转换配置文件。这是如何完成的:
右键单击要执行此操作的 Web 项目,然后选择“卸载项目”(而不是“删除项目”)。
再次右键单击同一个 Web 项目(现在应该是灰色的)并选择“编辑 ...csproj”。这将在 Xml 编辑器中打开项目。
向下滚动,直到找到包含所有“Web.config”列表的部分。现在,注释掉 Xml 中的所有“DependentUpon”元素。
关闭 Xml 编辑器并保存您的更改。接下来,再次右键单击您的项目并选择“重新加载”。当项目重新加载时,您会注意到 Web.configs 不再“堆叠”在“Web.config”下。这是“欺骗”TFS 所必需的。
现在,复制“Web.config”文件,将其粘贴到同一个项目中,并将其重命名为“Web.base.config”。这将用于每次重新生成 Web.config(接下来介绍)。
现在,选择 Web.config 文件并转到“文件 --> 源代码管理 --> 从源代码管理中排除 Web.config”。此外,打开源代码管理资源管理器(TFS 资源管理器视图)并找到 Web.config 所在的位置并将其从 TFS 中删除。这样做是因为每次构建项目时都会重新生成 Web.config(我将在接下来介绍)。
现在,我们将创建一个新的构建文件,该文件将帮助我们为任何构建类型重新生成 Web.config,甚至是调试类型(这是 Web.config Transformed 一开始就缺乏的)。在您的项目中创建一个新的 Xml 文件并将其重命名为“[YourProjectName].wpp.targets”。请务必准确命名您的项目,包括所有点、破折号等(例如 My.Project.wpp.targets)。
现在,将以下 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>
现在,从现在开始,您永远,永远不要编辑 Web.config,每次应用编译时它都会被覆盖。您只需编辑“Web.base.config”。
现在,让我们让项目看起来像原来的样子。再次右键单击项目并“卸载”它。现在,再次右键单击并“编辑”它。现在,返回并取消注释我们在第 3 步中注释掉的所有元素。此外,您应该在“Web.base.config”元素下添加“DependentOn”元素,以便它也将显示在“Web.config”下。关闭并保存它,然后再次重新加载您的项目。您应该注意到所有配置现在都再次位于“Web.config”下。
此时,您可以根据需要向项目/解决方案添加任意数量的配置。例如,我添加了一个名为“Tim (Debug)”的构建配置,但项目配置名为“Tim.Debug”。当我右键单击“Web.config”并选择“添加配置转换”时,它现在添加了我的“Web.Tim.Debug.config”文件。您还可以为每个环境或每个团队添加配置。
值得注意的是,您的个人配置文件只是“Web.base.config”的子集,它们将在任何构建过程中“转换”。要在调试期间切换要构建的转换,只需转到解决方案的顶部并选择您想要的构建配置。只要您有该构建配置的 web.config,它就会转换。如果没有,您将获得“Web.base.config”。
注意:这也应该适用于标准的 Windows/WPF 应用程序以及使用“app.config”代替。
【讨论】:
这真是太棒了。我进行了一项更改,以便在没有 Web.Configuration.config 时不会出错:<Target Name="ConfigurationTransform" BeforeTargets="BeforeBuild" Condition="Exists('Web.$(Configuration).config')">
。我们应该注意到,每个开发人员都必须在自己的“配置”中构建。我希望有一种可靠的方法可以在项目中包含“machine.config”,而不需要 VS 不断尝试签入。
+1 这正是我自己的想法。所以我在这里搜索并得到了它。伟大的工作蒂姆。
再问一个问题:既然您已经使用过这些 MS 构建目标,您可能也知道要添加什么来转换其他一些配置文件? Web 配置允许在不同的配置文件中定义 appSettings,即 appSettings.config。我们如何将其添加到转换中(应该手动编辑依赖项以使这些转换分层显示,但这不是问题)。
谢谢@Tim。任何人都知道这是否适用于 TFS Build?我想要 Web.Staging.config 之类的东西,以便它自动构建并发布到开发/登台环境。
我认为第 7 步需要更正:“从 TFS 删除 web.config 之前需要关闭解决方案,否则 web.config 也会从 web-project 中删除”。【参考方案2】:
迄今为止,对于使用 TFS 管理每个开发人员的不同 web.config 文件,我还没有看到一个好的答案。
但是,如果解决了导致开发人员需要不同 web.config 文件的问题,则无论选择何种版本控制系统,这通常都会产生更好的结果。
例如,开发人员环境之间的差异较小将减少 Works On My Machine (WOMM) 参数,并且通常还会减少开发以外的环境(例如测试、生产)的配置更改,从而简化部署并减少烦人的环境配置- 特定的错误。
根据配置项的性质,通常有几种不同的策略来缓解每个环境的差异。我怀疑其中许多已经在 Stack Overflow 上得到了答案。
【讨论】:
【参考方案3】:贾勒特,
我所拥有的只是关于我们如何处理这种情况的轶事。
我们有一个由 4 名程序员组成的团队。
我们使用 VS 之外的源代码控制解决方案——TortoiseSVN。我们每个人都维护自己的本地 web.config,它包含在项目中。项目文件包含在存储库中,但我们将 web.config 设置为“提交时忽略”状态。
我不确定您使用的是什么源代码控制,但是使用 Tortoise SVN(在 Visual Studio 之外运行)的颠覆对我们的小团队来说非常有用。我们大多数人在两台不同的机器上编程......一台在办公室,一台在家里..所以当你把它与我们有两台生产服务器的事实结合起来时,我们可以轻松地处理每个项目 10 个 web.config。
话虽如此,您必须记住在设置新的开发计算机时带上另一个开发人员的 web.config 文件,否则解决方案将无法正确加载,或者设置不包含适当的默认 web.config连接字符串和应用设置。
最后一点:我们使用 IIS 7 进行调试
【讨论】:
很遗憾,我们这里使用的是 TFS2010,所以它没有 SVN 那样的灵活性。我希望它具有忽略单个文件的简单能力。 Jarret,我认为我的建议可能并不完全相关,只是想分享一下我的经验【参考方案4】:SO 对此here 有一个很好的答案。我还没有检查 VS2010 中的多个 web.config,但我想知道这是否是因为他们对 web.conig 所做的更改而添加的。
【讨论】:
是的,我对此进行了研究,并且在移动到不同的服务器时会起作用。但是,我不想检查每个开发人员的 web.config 版本(以及必须创建不同的构建配置文件),所以我希望完全避免签入。【参考方案5】:我已经使用 T4 模板来解决这个问题。您有一个生成 web.config 的 web.tt,而不是 web.config。在 web.tt 文件中,您可以根据机器名或当前用户生成不同的代码。
【讨论】:
如果您能指出一些有关执行此操作的资源,我会很高兴,我听说过很多,但从未使用过 T4 模板 哈哈,好吧。我会看到您的链接并为您提供一些自动化; ) letmebingthatforyou.com/?q=t4%20template以上是关于在 VS2010 和 TFS 中管理团队的 web.config的主要内容,如果未能解决你的问题,请参考以下文章