使用 NANT 个性化 .NET 配置文件





5.00/5 (2投票s)
让您能够为每个开发人员、每台机器、每个配置个性化您的配置文件。
引言
.NET 的配置文件(例如 app.config、web.config 等)方便易用,但在使用 SVN、TFS 等版本控制工具进行协作开发的环境中,它们是静态的,并且管理起来非常麻烦。
尽管 Microsoft 在 Visual Studio 2010 中引入了 web.config 转换,但它(如果我没记错的话)存在一些限制。
- 它仅适用于 web.config(app.config 有解决方法)。
- 它不允许为每个开发人员设置 web.config。
- 您必须熟悉 XSLT 类技术。
- 它仅适用于 Visual Studio 2010(显而易见)。
如果您想个性化您的配置文件,**不依赖项目类型**(WinForm、ASP.NET、控制台等),**不依赖您的 Visual Studio 版本**,那么本文将为您提供一个免费、易于使用且可定制的解决方案,以满足您的需求。
背景
个性化配置文件这一想法源于我作为团队领导的经验,我曾花费部分时间和精力来维护配置,并解决十几个 .NET 开发人员在 SVN 下的配置文件的版本冲突。
事实是,每个开发人员都会修改检出(SVN 术语)的配置文件,并填入自己的值(连接字符串、调试模式等)以满足其需求,然后提交其个人更改,导致其他开发人员失去其值,或者在下次更新时出现冲突(SVN 对 XML 的合并效果不佳)。
"开箱即用" 示例项目
本文提供的示例项目向您展示了如何根据 Visual Studio 的配置(Debug 或 Release)来个性化名为 "App.Config" 的配置文件中的值。
注意:NANT 配置为从 "%ProgramFiles%\Nant\bin\NAnt.exe" 运行。
每次编译时,NANT 将在预构建时在 "Default.build
"(蓝色圆圈)中运行任务,从 "VisualStudioConfiguration" 文件夹获取属性,并将模板化的 "App.Config" 复制到项目根目录(绿色箭头)。

分步个性化
下载并安装/部署 NANT
NANT 是一个出色的 开源 .NET 构建工具(是 Java ANT 项目的移植),允许您以 XML 格式编写构建文件。本文完全基于此,因为它允许我们复制文件并用上下文值替换嵌入的属性(符号)。
首先,您需要在团队中每个开发人员的计算机上获取并部署最新稳定版本的 NANT,并针对您选择的 .NET 框架(从 1.0 到 4.0)。
将存档解压缩到您选择的文件夹。
注释
- 在协作环境中,**所有人都必须将 NANT 安装在同一个目录中,这非常重要**,例如 "%ProgramFiles%\Nant",以便有一个已知的可执行文件路径,如 "%ProgramFiles%\Nant\bin\NAnt.exe"。
- NANT 是一个 32 位可执行文件,因此如果您将其安装在 "%ProgramFiles%" 文件夹中,请注意 64 位系统,您需要将其安装在 "Program Files (x86)" 中,而不是 "Program Files"。
- 本文不解释如何创建构建文件,而是解释如何使用 NANT 个性化配置文件。
准备一个要个性化的配置文件
选择一个项目和您要个性化的配置文件。然后:
- 创建一个文件夹来存放您的 NANT 相关文件,假设其名称为 "
YourNantDirectory
"。 - 创建一个子文件夹来存放您的模板化配置文件,假设其名称为 "
YourTemplatesDirectory
"(路径为 "YourNantDirectory\YourTemplatedFilesDirectory")。 - 如果需要,请创建另一个子文件夹来存放最终的配置文件,假设其名称为 "YourCopiedFilesDirectory"(路径为 "YourNantDirectory\YourCopiedFilesDirectory")。如果您只想个性化根配置文件,例如 Web.config 或 App.config,则无需创建它。
- 将您的配置文件移到此文件夹中。
- 别忘了提交移动操作并忽略原始文件(SVN 术语)。
创建构建文件
NANT 构建文件是整个过程的核心,它以 XML 格式包含属性(符号)、任务等。要创建它:
- 探索您的解决方案
- 使用以下模板创建您的构建文件:
- 将 "YourProjectName" 替换为您的项目的友好名称(这对于本文末尾描述的 NANT 的其他用途可能非常有用)。
- 将 "YourTemplatedFilesDirectory" 替换为正确的目录名称,并将 "YouConfigurationFile" 替换为模板化配置文件的名称(例如 App.config、Web.Config 等)。
- 选择输入文件和输出文件的正确编码(请阅读 NANT 文档以了解更多属性)。
- 别忘了添加 "
expandproperties
" 过滤器链以展开您的属性。
注意
- "
copy
" NANT 任务是一个常用的任务,其目的是将输入文件复制到输出文件。 - 注意路径,它们是相对于此构建文件的!
您的构建文件现在应该看起来像这样:
<?xml version="1.0"?>
<project default="YourProjectName">
<target name="YourTargetName">
<copy file="YourTemplatedFilesDirectory/YouConfigurationFile"
tofile="../YouConfigurationFile" inputencoding="utf-8"
outputencoding="utf-8" overwrite="true">
<filterchain>
<expandproperties />
</filterchain>
</copy>
</target>
</project>
每次编译前启动 NANT
NANT 必须在每次编译前触发以生成配置文件,为此:
- 右键单击您将要启用 NANT 的项目,然后选择 "属性"。
- 单击 "生成事件" 选项卡。
- 在每次编译前(预构建)调用 NANT 的行中添加以下内容:
- 别忘了将 "
YourTargetName
" 替换为构建文件中的目标名称。 - 将 "YourRelativeDirectoryToBuildFile\YourBuildFile" 替换为您将来构建文件的相对路径,相对于项目根目录。
"%ProgramFiles%\Nant\bin\NAnt.exe" YourTargetName
/f:"$(ProjectDir)YourRelativeDirectoryToBuildFile\YourBuildFile"
exit 0
现在您可以进行第一次编译测试了,构建您的项目并查看控制台输出,您应该会看到类似如下的内容:
"%ProgramFiles%\Nant\bin\NAnt.exe" PreBuild
/f:"YourProjectAbsolutePath\YourRelativeDirectoryToBuildFile\YourBuildFile"
exit 0
NAnt 0.85 (Build 0.85.2478.0; release; 14/10/2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net
Buildfile: file:///YourProjectAbsolutePath/YourRelativeDirectoryToBuildFile/YourBuildFile
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: PreBuild
[include] YourProjectAbsolutePath\YourRelativeDirectoryToBuildFile\YourBuildFile(?,?):
YourTaskName:
[copy] Copying 1 file to 'YourProjectAbsolutePath\YourConfigurationFile'.
BUILD SUCCEEDED - 0 non-fatal error(s), 0 warning(s)
如果此构建未成功,请检查您的构建文件。
个性化您的配置文件
假设您想个性化您的 Web.config 或 App.config 文件,最好的例子是连接字符串。
打开模板化配置文件,并将当前的连接字符串替换为 NANT 属性,例如 "AppSettings.ConnectionString
"。
<configuration>
<appSettings>
<add key="ConnectionString" value="${AppSettings.ConnectionString}" />
</appSettings>
</configuration>
注意:切勿修改生成的配置文件,否则您将在下次构建时丢失您的修改(这是每个人都会犯的常见错误)。
如果您再次尝试编译项目,您将收到以下错误,并且输出文件将为空。
Cannot copy 'YourProjectAbsolutePath\YourTemplatedFilesDirectory\YourConfigurationFile'
to 'YourProjectAbsolutePath\YourConfigurationFile'.
YourProjectAbsolutePath\YourRelativeDirectoryToBuildFile\YourBuildFile(?,?):
Property evaluation failed.
Expression: <configuration> <appsettings>
<add key="ConnectionString" value="${AppSettings.ConnectionString}">
</add> </appsettings> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Property 'AppSettings.ConnectionString' has not been set.
本文的最终目标是获得个性化的配置文件,但如果您愿意或需要,可以在构建文件中为该属性定义一个默认值,方法是将此节点添加到 project 节点下方:
<property name="AppSettings.ConnectionString" overwrite="false"
value="Your default connection string"></property>
按 Windows 用户配置文件的个性化
现在是时候进入正题了:为每个 Windows 用户获取个性化的配置文件。
- 打开您的项目 "YourNantDirectory" NANT 文件夹。
- 创建一个子文件夹来存放 Windows 用户的属性文件,假设其名称为 "WindowsUsersProperties"(路径为 "YourNantDirectory\YourTemplatedFilesDirectory")。
- 选择(或不选择)属性文件的文件扩展名,例如 "properties"。
首先,我们在构建文件中定义一个属性,以记录当前环境的用户名。
<property name="Username" value="${environment::get-user-name()}"
overwrite="false" />
然后我们包含当前 Windows 用户的属性文件。
<include buildfile="YourNantDirectory/WindowsUsersProperties/${Username}.properties"
failonerror="false" if="${Username != ''}" />
现在您可以创建自己的属性(yourWindowsUsername.properties)文件来个性化连接字符串。
<project>
<property name="AppSettings.ConnectionString" value="MyConnectionString" />
</project>
构建您的项目,在最终配置文件中查看您的连接字符串!
按计算机用户配置文件的个性化
按计算机(机器)配置文件的个性化也是可能的(但相对于按 Windows 用户配置文件的个性化,几乎没有用)。
过程几乎相同。您必须在构建文件中定义一个属性,以记录当前环境的机器名称。
<property name="MachineName" value="${environment::get-machine-name()}"
overwrite="false" />
然后我们包含当前机器的属性文件。
<include buildfile="YourNantDirectory/MachinesProperties/${MachineName}.properties"
failonerror="false" if="${MachineName != ''}" />
按配置用户配置文件的个性化
这是最接近 Visual Studio 2010 web.config 转换功能的个性化类型。
由于我们无法在 NANT 构建文件中访问当前的 Visual Studio 配置,因此解决方法是通过命令行(参见 "每次编译前启动 NANT" 部分)以以下方式获取它:
"%ProgramFiles%\Nant\bin\NAnt.exe" YourTargetName
/f:"$(ProjectDir)YourRelativeDirectoryToBuildFile\YourBuildFile"
-D:Configuration="$(ConfigurationName)"
exit 0
现在我们可以使用以下方式包含当前 Visual Studio 配置的属性文件:
<include buildfile="YourNantDirectory/VisualStudioConfigurationsProperties/
${Configuration}.properties" failonerror="false" if="${Username != ''}" />
然后,我们可以(例如)自动更改 Web.config 的 debug 属性值,使用一个属性,例如:
...
<compilation debug="${AppSettings.Compilation.Debug}">
...
使用以下 Debug.properties
文件:
<project>
<property name="AppSettings.Compilation.Debug" value="true" />
</project>
以及这个 Release.properties 文件:
<project>
<property name="AppSettings.Compilation.Debug" value="false" />
</project>
就这样,各位。
其他想法
如果您曾经对由您的团队使用的 SQL Server 实例使用过 SQL Server Profiler,您可能在仅查看您的 SQL 查询时遇到过一些问题。您可以使用 NANT 自动将您的 Windows 用户名附加到您的 SQL Server 连接字符串中,以便对其进行筛选。
如果您的 JavaScript 文件很大,您可以将其拆分成小文件,然后进行聚合甚至压缩。
您的限制将是您的想象力或仅仅是您的需求,请在本文的评论中发布您的想法……
关注点
本文不要求高级技能,但它(在我看来)是一个好主意,我很高兴与您分享,并且它将使您的日常工作更轻松,就像它自从 2008 年以来使我的工作一样。
NANT 是一个强大的工具,它为您提供了自动化许多繁琐任务的机会。如果您的想象力受限于其内置任务,您可以在互联网上搜索自定义任务(JavaScript 压缩等)。
历史
- 2010/09/13:第一个版本