twa*_*z01 90 c# configuration app-config web-config visual-studio
我们有几个.NET项目,我们在配置文件中存储某些设置.现在每个开发人员都有自己的配置文件,这些配置文件略有不同(连接到本地数据库的不同连接字符串,不同的WCF端点等)
目前我们倾向于检查app/web.config文件并修改它们以满足我们的需求.这会导致许多问题,因为从tfs获取最新版本时,有时会有人检查自己的设置或松散自定义配置.
我的问题是:你如何处理这样的情况?或者你根本没有这个问题?
Gav*_*vin 66
我们使用的系统结合了本页面上的几个现有答案,并借鉴了Scott Hanselman提出的这一建议.
简而言之,我们所做的是拥有一个通用的app.config/web.config,并在各个文件中包含大部分特定设置,如此处的其他答案所示.例如,对于我们的SMTP设置,app.config包含
<system.net>
<mailSettings>
<smtp configSource="config\smtp.config" />
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)
该文件是在源代码控制.但是,像这样的单个文件不是:
<?xml version="1.0" encoding="utf-8" ?>
<smtp deliveryMethod="Network">
<network host="127.0.0.1" port="25" defaultCredentials="false" password="" userName ="" />
</smtp>
Run Code Online (Sandbox Code Playgroud)
但这并不是故事结束的地方.新开发人员或新的源代码安装怎么样?大部分配置不再受源代码控制,手动构建所需的所有.config文件都很痛苦.我更喜欢拥有至少可以直接编译的源代码.
因此,我们会在源代码管理中保留.config文件的一个版本,名为.config.default文件.因此,新的源代码树如下所示:

尽管如此,对开发人员来说并没有任何用处,因为对于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.
Run Code Online (Sandbox Code Playgroud)
该脚本可以安全地重新运行,因为已经拥有.config文件的开发人员不会覆盖它们.因此,可以想象,可以将此批处理文件作为预构建事件运行..default文件中的值对于新安装可能不完全正确,但它们是一个合理的起点.
最终每个开发人员最终得到的是配置文件的文件夹,如下所示:

这看起来有点令人费解,但它绝对比开发人员踩到彼此的脚趾更麻烦.
fam*_*iro 21
在您的Web.config中使用来自其他文件的源代码
<configuration>
<connectionStrings configSource="ConnectionStrings.config" />
...
</configuration>
Run Code Online (Sandbox Code Playgroud)
将web.config保留在版本控制中,不要为ConnectionStrings.config执行此操作.现在所有开发人员都有一个连接字符串文件.
您可以对本地相关的所有设置执行此操作.
Sim*_*ier 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>
Run Code Online (Sandbox Code Playgroud)
此目标将转换与当前登录的开发人员相对应的Web.config文件 - 因此$(USERNAME)变量 - ,并在1中创建相应的文件.只有在每次构建时内容已更改(以避免重新启动)时,它才会替换本地Web.config,即使本地Web.config是源控制的,这 OverwriteReadOnlyFiles就是设置为True的原因.事实上,这一点是有争议的.
2)Web.[developer windows login].config为项目中的每个开发人员创建一个名为的文件.(例如,在以下屏幕截图中,我有两个名为smo和smo2的开发人员):

这些文件(每个开发人员1个)可以/应该是源控制的.它们不应该被标记为依赖于主Web.config,因为我们希望能够单独检查它们.
每个文件都代表一个转换,以应用于主Web.Config文件.此处描述了转换语法:Web应用程序项目部署的Web.config转换语法.我们重用这个很酷的Xml文件转换任务,它与Visual Studio一起开箱即用.此任务的目的是合并 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>
Run Code Online (Sandbox Code Playgroud)
现在,这个解决方案并不完美,因为:
但至少,你只需要为每个开发人员维护一个独特的主web.config和一个转换文件.
对于App.config(非web)文件可以采用类似的方法,但我没有进一步详细说明.
| 归档时间: |
|
| 查看次数: |
24092 次 |
| 最近记录: |