如何将配置转换应用于外部配置文件

32

我在网上找不到我的问题的例子,想知道是否有人知道解决方案。基本上,如果我们在web.config中指向另一个文件,像这样:

<configuration>
  <configSections />
  <appSettings file="AppSettings.config">
</configuration>

那么我们如何对外部文件应用转换呢?

基本上,我想创建一个AppSettings.config、AppSettings.Debug.config、AppSettings.Release.config,并对其运行一个转换...这是可能的吗?

提前致谢,

Sergio

3个回答

33

有几种解决方法:

解决方法1

  • 编写 AppSettings.Debug.config, AppSettings.Release.config文件,并使用完整的值(不要使用转换属性)
  • 在您的web.config中,使用转换功能,将其替换为适当的文件:

web.debug.config

<appSettings file="AppSettings.debug.config" 
             xdt:Transform="SetAttributes" xdt:Locator="Match(file)"/>

web.release.config

<appSettings file="AppSettings.release.config" 
             xdt:Transform="SetAttributes" xdt:Locator="Match(file)"/>

虽然这不是理想的解决方案,有点违背了transforms的初衷,但在某些情况下,可能比使用SlowCheetah之类的工具更为合适。

解决方案2

可以使用TransformXml构建任务,在构建期间转换您的文件,如此处此处所示。


通过解决方法1,我在部署版本中不需要单独的AppSettings.config,对吗?“预设”的AppSettings.Release.config将合并到主web.config中。 - Matthias Max
1
你仍然需要部署 AppSettings.release.config 文件。这些设置不是从 web.config提取 的,而是从指定的文件中加载的。 - Mrchief

9

有一个名为Slow Cheetah的Visual Studio插件项目,它采用转换的思想,并允许您将其应用于除web.config之外的其他文件。我没有使用过它,但我认为它可以实现您想要做的事情。Scott Hanselman在他的博客中对此进行了介绍。


5

接受答案中的解决方法1让我走上了正确的道路,但因为转换不完全正确,所以不能直接使用。正确的转换只需:

<appSettings file="AppSettings.debug.config" 
         xdt:Transform="SetAttributes"/>

我必须删除 xdt:Locator="Match(file)",这样文件属性本身才会改变。 Web Config Transformations 解释了 Match(key) 将定位要更改的元素,但仅更改节点的其他元素,而不是定位器/匹配关键字本身。每个配置文件中只有一个 appSetting,因此我们不需要定位特定的实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接