2009-09-04 47 views
5

我们使用Scott Hansleman对其多个web.configs的建议从他的文章here。我们遇到的问题是我们必须检查Web.Config。如果我们从项目中删除它,当我们发布时,不会推送web.config。因此,我们需要从web.config中删除源代码控件绑定,但将其留在项目中,并让项目的其余部分仍处于源代码管理之下。TFS 2008,从源代码管理中删除文件,但将其保留在项目中

问题是,源代码管理使文件只读,直到您签出。我们需要能够用预建事件覆盖它,最好不必检查它。有没有办法只从该文件中删除绑定,并仍然将其作为项目的一部分?

谢谢。

回答

8

通过向解决方案资源管理器添加一个新文件,您将得到一个小加号,指示它将被添加到源代码管理中。然后,右键单击并选择“撤消挂起的更改”。这将取消添加,但将文件保留在项目中。

如果不工作,我建议以下方法之一:

+0

所以,我需要删除文件,检查它,添加一个新的web.config,然后撤消? – Josh 2009-09-04 14:56:01

+0

是的,我建议先从源代码控制中删除文件。 – 2009-09-04 14:59:08

+0

不要这样做。它击败了整个观点。 – 2009-09-04 20:05:36

3

您应该将文件保留在源代码管理中。否则,您将遇到以下几个问题:

  • 更改将不会进行版本控制。 'nuf说。
  • 即使web.config是最有可能在并行开发/测试/生产环境之间变化的文件之一,它也不能被分支或合并
  • 您在本地进行的更改不会传播给没有手动的同事解决方法
  • 开发人员首次设置环境将无法获取文件
  • 团队构建不会包含该文件,因此您的部署也不会。 (当然你不直接从桌面部署?!)

请注意,单个文件的状态完全存储在TFS服务器上。 (如果您好奇,'tf properties'会转储此元数据)仅限项目&解决方案实际上已将绑定写入文件。甚至那些虚假的条目告诉VS“不要担心我,只问TFSProvider,它会知道我是谁,我应该在哪里。”虽然VS项目系统中存在许多其他的怪癖让我感到无穷的头痛,在这种情况下,它是你的朋友。不要规避它。

最佳选择:

  1. 编辑生成脚本来切换只读属性前/后修改。如果您使用链接的博客文章中的“copyifnewer.bat”脚本,它应该是一个额外的行。即使你想让事情完全在MSBuild的makefile中声明,在3rd party tasks的帮助下,它几乎没有任何工作。

  2. 使用文件 - >源代码管理 - >排除功能。应用此设置后,该文件仍处于源代码管理之下,但不再受活动解决方案的自动签出/签入的限制。换句话说,你可以在本地编辑文件到你的内容而不影响其他任何人,但是如果你想提交(或搁置)你的更改,你需要从源代码管理资源管理器或命令行执行它。

选项#1的优点是可以快速修复您现有的设置。不足之处来自维护web.config的多个副本*。复制/粘贴代码不好的原因相同:如果更改其中一个,则必须更改所有其他副本 - 或者更糟糕的是,忘记并让它们不同步直到奇怪的错误迫使你重新审视这个问题。这可以通过改变进程来改进,以便只有一个“master”web.config,并且其他副本只包含差异(通过文本diff引擎,XSLT转换,Powershell中的编程操作等)。当然,这是更多的工作。

选项#2避免了#1的问题,而且开销很小。 (工程过程本身没有改变;唯一不同的是Visual Studio UI的行为)如果您经常对web.config进行更改,则此优势非常关键。缺点是没有内置的方法来跟踪“主”文件的变化。如果唯一的差异很简单,例如一个或两个连接字符串,您可能会发现最简单的方法就是坚持一个“主”,让人们在其开发机器上进行临时更改。甚至有工具可以为你做这件事,比如Web Deployment Projects(简单)和IIS Deployment Tool(复杂)。无论如何,当然你的实际部署应该是自动的,并且是源代码控制的!如果需要比这些工具更强大的自定义功能,那么您可能需要前面描述的混合主控+变换方法。

+1

我理解你的观点,理查德,但web.config仅仅是项目中其他4个文件中的一个的副本,它们已经在源代码控制之下。该文件根据构建配置根据环境简单地换出。拥有它在TFS中是不必要的,因为它只是已经受版本控制保护的副本,并且令人头疼。感谢您的输入! – Josh 2009-09-14 20:59:45

+0

没有问题。无论如何,我会检查选项#2 - 这是那些鲜为人知的VS功能之一,一旦你知道它,你会发现非常宝贵的 - 即使不是特别针对web.config。 – 2009-09-16 01:54:27

+1

排除不起作用,因为当我发布时,不会推送web.config。它必须是项目的一部分,但不是源代码控制,因此我可以覆盖它。 – Josh 2009-11-10 16:53:45

相关问题