2010-09-14 50 views
74

我们有几个.NET项目,我们将某些设置存储在配置文件中。 现在,每个开发人员都将拥有自己的配置文件,这些配置文件有点不同(不同的连接字符串以连接到本地数据库,不同的WCF端点等)。开发人员在Visual Studio中的特定app.config/web.config文件

目前我们倾向于检出app/web.config文件并修改他们适合我们的需求。 这会导致很多问题,因为有时候会有人在从tfs获取最新版本时检查自己的设置或者自定义配置。

我的问题是:你如何处理这样的情况?或者你根本没有这个问题?

+4

我投票重新开放,因为这是Visual Studio开发人员的常见问题,直接涉及开发人员正在使用的工具。 (因此得票) – 2017-06-09 17:25:02

+0

同意,这是一个长期存在的问题,因为我们的团队规模不断扩大,各种解决方案的尝试都不尽如人意。 – DiskJunky 2017-10-16 09:24:52

回答

3

我们使用machine.config来避免环境之间的web.config有差异。

+10

宁愿要避免不得不改变machine.config – twarz01 2010-09-14 10:10:21

0

如何忽略文件,所以它永远不会被检入?我遇到了类似的问题,并且已经将web.config添加到Subversion中的忽略列表中。

但是在TFS中,这有点难度,请参阅this post了解如何操作。

0

您可以应对的一种方法是使用标记系统并使用rake脚本来更改值。

一个更基本的方法可能是在你的web.config一个链接到AppSettings.config文件所有的AppSettings(带连接相似),即

<appSettings configSource="_configs/AppSettings.config" /> 

然后有一个文件夹与您的每一个开发人员在子文件夹中有一个版本(即/ _configs/dave /)。然后,当开发人员正在处理他们自己的代码时,他们将从子文件夹复制到链接文件夹的根目录。

您将需要确保您将更改传达给这些文件(除非您使用标记)。如果您将AppSettings.config文件放在源代码管理之外,并且只检查开发者个人文件夹(所有文件夹),那么他们将被迫复制正确的文件夹。

我更喜欢标记,但如果这只是一个快速修复,可能会更难以启动和运行。

17

在你的web.config使用源来自其他文件

<configuration> 
    <connectionStrings configSource="ConnectionStrings.config" /> 
... 
</configuration> 

请版本控制在web.config并没有为ConnectionStrings.config做到这一点。 现在所有的开发人员都有一个连接字符串文件。

您可以对本地相关的所有设置执行此操作。

+1

这对我很好。另请参阅:http://davidgiard.com/2012/05/25/MovingConfigSectionsToExternalFiles.aspx ConnectionStrings.config文件必须位于与应用程序或Web配置相同的文件夹中。此外,您必须将其属性更改为'复制如果更新'来输出。和ConnectionStrings。配置文件需要打开和关闭元素的完整部分。您还必须将版本控制设置为忽略该文件,以便每个用户都是特定的。 – 2017-04-17 18:24:46

+0

我使用了选项,因为我必须合并设置 – Spikolynn 2017-08-23 06:05:33

1

忽略这些文件并且有一个Commom_Web.Config和Common_App.Config。使用具有构建任务的持续集成构建服务器,将其重命名为正常名称,以便构建服务器可以完成其工作。

+0

这需要在开发机器上完成,然后才能构建服务器 – twarz01 2010-09-14 10:10:48

+0

否这种重命名应该在构建服务器上发生。常见的配置文件存储在subversion上,它们独立于特定的开发者。 虽然每个开发人员都运行其个人配置文件在他的机器上开发,并且不关心提交它,因为它不是Subversion的一部分。 – Arthis 2010-09-14 10:21:04

58

我们使用的系统结合了本页面上的几个现有答案,再加上了this suggestion by Scott Hanselman

简而言之,我们所做的就是拥有一个通用的app.config/web.config,并在单个文件中具有大部分特定设置,正如其他答案所示。例如为我们的SMTP设置,应用程序。配置包含

<system.net> 
    <mailSettings> 
    <smtp configSource="config\smtp.config" /> 
    </mailSettings> 
</system.net> 

此文件是在源控制。但是,像这样的单个文件不是:

<?xml version="1.0" encoding="utf-8" ?> 
<smtp deliveryMethod="Network"> 
    <network host="127.0.0.1" port="25" defaultCredentials="false" password="" userName ="" /> 
</smtp> 

这并不是故事结束的地方。那么新开发者或新鲜的源代码安装呢?大部分配置不再处于源代码控制之中,手动构建所需的所有.config文件是一种痛苦。我更喜欢将源代码至少编译出来。

因此,我们在源代码控制中保留.config文件的一个版本,名称为.config.default文件。因此,一个新的源树是这个样子:

alt text

不过,不是真的任何使用开发者,因为到Visual Studio,他们只是毫无意义的文本文件。因此,批处理文件,copy_default_config.bat,负责从.config.default文件创建一组初始的.config文件:

@echo off 
@REM Makes copies of all .default files without the .default extension, only if it doesn't already exist. Does the same recursively through all child folders. 
for /r %%f in (*.default) do (
    if not exist "%%~pnf" (echo Copying %%~pnf.default to %%~pnf & copy "%%f" "%%~pnf" /y) 
) 
echo Done. 

该脚本安全地重新运行,可在开发商谁已经有自己的.config文件不会被覆盖。因此,可以想象将这个批处理文件作为预生成事件运行。对于新安装,.default文件中的值可能不完全正确,但它们是合理的起点。

最终每一个开发者与最终是配置文件的文件夹,看起来是这样的:

alt text

这似乎有点令人费解,但它绝对是最好的开发商踩着麻烦彼此的脚趾。

+0

为什么不直接在存储库中使用主.config文件,而是单独使用.config文件。 – graffic 2011-11-21 08:17:54

+2

真是痛苦,我们需要更好的解决方案。我设置了类似的方法,并且厌倦了它非常脆弱,仍然需要向新开发人员解释。 – jpierson 2012-01-20 07:49:42

+0

@Gavin,如果我尝试运行您所概述的bat文件,则会收到错误消息:'∩╗┐@ echo'未被识别为内部或外部命令,可操作程序或批处理文件。 – Austin 2015-06-19 13:48:09

0

我们有同样的问题,我们正在做的是

  • 检查与TESTSERVER /生产值在web.config
  • 开发者进入Windows资源管理器和更改文件
  • 的只读模式
  • 编辑配置以适合其环境。
  • 只有在部署值发生更改或添加或删除任何配置条目时,才会检入web.config。
  • 这需要评论的一个良好的金额为每个配置项,因为它需要每个开发
+0

这可能会在您使用的源代码管理控制台默认情况下只读为只读的商店中更好地工作,但对于使用Subversion的其他商店,它可能无法正常工作。我们可以在存储库中设置只读权限,以防止它被提交,但是需要在每个分支的每个配置文件上设置。 – jpierson 2012-01-20 21:35:27

0

假设你正在使用Visual Studio,你为什么不使用不同的解决方案配置是否会改变? 例如:您可以使用一个使用Web.config.debug的调试配置和一个使用Web.config.release的发布配置。 Web.config.debug应该有类似

<appSettings file="C:/Standard_Path_To_Configs/Standard_Name_For_Config.config"> 

与文件Standard_Name_For_Config.config是GOTS所有的个人开发者设置,而Web.config.release总是有制作设置。 您可以将某些源控制文件夹中的默认配置存储起来,并让新用户从该文件夹中取出它们。

19

这里的web.config文件和Visual Studio 2010的解决方案:

1)手动编辑你的web应用的.csproj文件,添加一个AfterBuild目标是这样的:

<Project> 
    ... 
    <Target Name="AfterBuild"> 
     <Copy SourceFiles="web.config" DestinationFiles="obj\$(Configuration)\tempweb.config" /> 
     <TransformXml Source="obj\$(Configuration)\tempweb.config" 
        Transform="web.$(USERNAME).config" 
        Destination="obj\$(Configuration)\tempweb2.config" /> 
     <ReadLinesFromFile File="obj\$(Configuration)\tempweb2.config"><Output TaskParameter="Lines" ItemName="TransformedWebConfig"/></ReadLinesFromFile> 
     <ReadLinesFromFile File="web.config"><Output TaskParameter="Lines" ItemName="UnTransformedWebConfig"/></ReadLinesFromFile> 
     <Copy Condition=" @(UnTransformedWebConfig) != @(TransformedWebConfig) " SourceFiles="obj\$(Configuration)\tempweb2.config" DestinationFiles="web.config" OverwriteReadOnlyFiles="True" /> 
    </Target> 
    </Project> 

这一目标将改造与当前开发者相对应的Web.config文件登录 - 因此变量为$(USERNAME),并在1)中创建相应的文件。 即使本地Web.config是源代码控制的,它也会在每次构建内容更改(以避免重新启动)时替换本地Web.config,这就是为什么OverwriteReadOnlyFiles设置为True。这一点实际上是有争议的。

2)为项目中的每个开发人员创建一个名为Web.[developer windows login].config的文件。 (例如,在下面的屏幕截图我有一个名为SMO和smo2两个开发):

enter image description here

这些文件(1每显影剂)可/应源控制。它们不应该被标记为依赖主Web.config,因为我们希望能够单独检查它们。

这个文件的每一个表示一个转换应用于主Web.Config文件。 转换语法在这里描述:Web.config Transformation Syntax for Web Application Project Deployment。我们重复使用Visual Studio提供的这个很酷的Xml文件转换任务。此任务的目的是合并 Xml元素和属性,而不是覆盖整个文件。

例如,下面是一个示例web.[dev login].config改变命名的连接字符串“MYDB”,无论Web.config文件的其余部分:

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <connectionStrings> 
     <add name="MyDB" 
     connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
     xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 
    </connectionStrings> 
</configuration> 

现在,这个方案并不完美,因为:

  • 建成后,开发商可能有不同的Web.Config局部比源控制系统
  • 他们可能从源头上控制SYS得到一个新的Web.Config时强制本地写tem
  • 开发人员不应该在主web.config中检出/。它应该保留给少数人。

但是至少你只需要维护一个独特的主web.config加上每个开发者一个转换文件。

对于App.config(不是网页)文件可以采取类似的方法,但我没有进一步详细说明。

+0

我将Web.config重命名为Web.base.config,创建了一个新的Web.config文件,然后在步骤1中将更改为 2014-12-17 00:30:09

+0

这仍然不是理想的,但我更喜欢它的另一种解决方案 – JMK 2016-09-27 09:25:38

+0

你认为当web. $(USERNAME).config'不存在时可以使用'web.default.config'吗?谢谢你的答案。 – 2017-07-19 13:55:44

相关问题