1

我有一个正在尝试创建的 nuget 包,但似乎无法弄清楚如何使最后一部分正常工作。我正在使用config.install.xdt 转换来将配置元素添加到客户端配置文件中。

我只是<section>在客户端配置文件中添加一个新节点,如下所示:

<?xml version="1.0" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <configSections xdt:Transform="InsertIfMissing">
        <section xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"
                 name="myPackageName" 
                 type="MyPackage.Config.MySection, MyPackage" />
    </configSections>
</configuration>

问题是它<configSections>必须是<configuration>客户端 app.config 中根元素的第一个子元素。如果客户端应用程序中不存在<configSections>,则上述转换只是<configSections>作为<configuration>.

有没有办法强制<configSections>作为第一个孩子插入<configuration>

编辑 1

我想添加一些关于我尝试过的内容和结果的细节......

我使用的第一个转换是<configSections xdt:Transform="InsertIfMissing">. 即使这是我的 config.install.xdt 文件中的第一个子文件,它也会在安装时放置在客户端配置文件的末尾。

我已经尝试了几种变换 InsertBefore 和 InsertAfter 的变体。不幸的是,我不能只使用,例如,<configSections xdt:Transform="InsertBefore(/configuration/appSettings)"因为 appSettings 元素可能并不总是存在于客户端配置文件中,也可能不是第一个子节点。

我认为必须有一些功能,因为在将 nuget 包(如 Entity Framework)安装到具有尚未具有<configSections>节点的配置文件的项目中时,该节点将作为安装 Entity<configSections>的根中的第一个子节点添加<configuration>框架。

编辑 2

经过数小时的搜索并将我的头撞到墙上,通过 Leo 的回答,我发现了另一个 stackoverflow 帖子,其中的问题大致相同。我将我的问题标记为重复。这是链接

4

1 回答 1

0

如何在 config install xdt transform 中指定节点的插入位置

默认情况下<configSections>,将 nuget 安装到项目时,应该是客户端 app.config 中根元素的第一个子元素。

正如您所知并在文档中指定:

如果此元素在配置文件中,则它必须是该元素的第一个子元素

您可以在其中指定 app.config 中的配置部分,因此,它必须位于配置元素的开头。

因此<configSections>默认情况下,应该是客户端 app.config 中根元素的第一个子元素,即使<configSections>客户端应用程序中不存在。

作为测试,我创建了一个带有content文件夹的简单测试 nuget 包,其中包括App.config.transformWeb.config.transform. 将您的代码复制到以下内容中.transform

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <configSections xdt:Transform="InsertIfMissing">
    <section xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"
             name="myPackageName"
             type="MyPackage.Config.MySection, MyPackage" />
  </configSections>
</configuration>

然后将这个 nuget 包安装到测试项目中:

在此处输入图像描述

此外,您可以尝试使用通配符*而不是appSettings使用转换InsertBefore时,例如:

<configSections xdt:Transform="InsertBefore(/configuration/*[1])" />

希望这可以帮助。

于 2018-07-30T06:25:51.467 回答