<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>
然而,对于开发人员来说,它们只是无意义的文本文件,对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.
这可能看起来有点复杂,但绝对比开发人员互相干扰的麻烦要好。
<configuration>
<connectionStrings configSource="ConnectionStrings.config" />
...
</configuration>
将web.config纳入版本控制,而不是ConnectionStrings.config文件。 现在所有开发人员都有一个连接字符串文件。
你可以为所有本地相关的设置进行此操作。
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.[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.$(USERNAME).config
不存在的情况下,使用web.default.config
是否可行?顺便说一句,感谢您提供这个很棒的答案。 - Christian Gollhardt忽略文件怎么样?这样就不会被检查进去了。我遇到过类似的问题,已经将 web.config 添加到 Subversion 的忽略列表中。
但在 TFS 中,稍微有点难度,请参考this post中的方法。
忽略那些文件,使用一个 Commom_Web.Config 和 Common_App.Config 文件。使用一个持续集成的构建服务器来执行构建任务,并将这两个文件重命名为普通名称,以便构建服务器可以正常工作。
web.config
被使用。例如,如果您将web.config
添加到.gitignore
并要求用户将Commom_Web.Config
复制到web.config
并按照他们的喜好进行编辑,则已经完成了部分工作。但是,当您需要编辑所有开发人员机器上相同的内容时,例如system.web/compilation
部分或特定的appSettings
,此方案就会崩溃。 - binki你可以应对的一种方式是拥有一个标记化的系统,并使用rake脚本更改值。
一种更为基础的方法可以是在web.config中为所有AppSettings(类似于连接)提供指向AppSettings.config文件的链接。
<appSettings configSource="_configs/AppSettings.config" />
然后,每个开发人员都有一个子文件夹版本的文件夹(即/_configs/dave/)。当开发人员在自己的代码上工作时,他们将从子文件夹复制到链接文件夹的根目录。
您需要确保向这些文件通信更改(除非您进行令牌化)。如果将AppSettings.config文件保留在源代码控制之外,并仅检查开发人员的个人文件夹(所有文件夹),则他们将被迫复制正确的文件。
我更喜欢令牌化,但如果这只是一个快速修复,那么可能会更难以启动和运行。
<appSettings file="C:/Standard_Path_To_Configs/Standard_Name_For_Config.config">
有一个名为Standard_Name_For_Config.config的文件,其中包含所有个人开发者设置,而Web.config.release则始终具有生产设置。 您可以将默认配置存储在某些源控制文件夹中,并让新用户从那里获取它们。