Xmlpoke для добавления нескольких ключей appsettings не работает

У меня есть цель Msbuild, которая успешно выполняется путем добавления одного ключа с именем "ProjectID" в раздел appsetting файла web.config. Теперь я изменяю поведение этой цели, добавляя еще один ключ 'ApplicationId' в тот же раздел настроек приложения. Журнал показывает, что xmlpoke выполняется для обоих. Но только значение projectID корректно заменяется при каждом запуске.

(Выдержка из) Определение PropertyGroup:

<?xml version="1.0" encoding="utf-8" ?>
   <Project ToolsVersion="15.0" DefaultTargets="Build" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
   <!-- Needs to be set! -->
   <ProjectID>4424cc12-4368-45ad-ad5b-19e821eb91d4</ProjectID>
   </PropertyGroup>

TargetCode:

<Target Name="UpdateConfigFilesInSolutionDir">
  <ItemGroup>
  <WebConfigFilesSolutionDir Include="$(SolutionDir)\**\*.config" />
  </ItemGroup>
  <Message Text="WebConfigFilesPath: %(WebConfigFilesSolutionDir.FullPath)" 
   Importance="high"></Message>
  <XmlPoke XmlInputPath="%(WebConfigFilesSolutionDir.FullPath)" 
   Query="//appSettings/add[@key='ProjectID']/@value" Value="$(ProjectID)" 
  />
  <XmlPoke XmlInputPath="%(WebConfigFilesSolutionDir.FullPath)" 
   Query="//appSettings/add[@key='ApplicationId']/@value" Value="SetAValue" 
  />
</Target>

Выходной журнал наблюдается:

Использование задачи "XmlPoke" из сборки "Microsoft.Build.Tasks.Core, версия =15.1.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a". 2019-06-25 08:37:13,202 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Задание "XmlPoke" 2019-06-25 08:37:13,203 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Заменено значение "4424cc12-4368-45ad-ad5b-19e821eb91d4". 2019-06-25 08: 37: 13,203 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Произведена 1 замена (и). 2019-06-25 08:37:13,204 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Выполнено задание "XmlPoke". 2019-06-25 08:37:13,204 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Задание "XmlPoke" 2019-06-25 08: 37: 13,204 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Сделано 0 замен. 2019-06-25 08:37:13,204 [9] DEBUG EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - Выполнено выполнение задачи "XmlPoke".

Что я уже пробовал:

  1. Первоначально передавал значение ApplicationId в PropertyGroup. Это не помогло.
  2. Таким образом, жесткое кодирование значения, как видно из кода, Value="SetAValue" по-прежнему не добавляет ключ к настройке приложения.

1 ответ

Решение

Оказывается, "Добавить" в синтаксисе запроса xpath не добавляет ключ. Скорее он добавляет или заменяет значения для ключа, если он существует. Хотя это не решает мою проблему добавления ключа настройки приложения во время сборки, по крайней мере, это дало мне ясность относительно возможности "добавления" Полезные ссылки: http://sedodream.com/2011/12/29/UpdatingXMLFilesWithMSBuild.aspx http://samirvaidya.blogspot.com/2015/04/updating-webconfig-or-appconfig-file.html https://deejaygraham.github.io/2015/01/12/updating-web.config-settings-with-msbuild/

Как добавить новый ключ в web.config во время сборки (ответ на мой оригинальный вопрос)

Комбинация XmlPeek и XmlPoke сделала его практически работающим, но с большей работой по очистке записываемых данных.

<Target Name="AddApplicationNodesInConfig">
<ItemGroup>
    <WebConfigFiles Include="$(SolutionDir)\**\Web.config" />
</ItemGroup>
<Message Text="WebConfigFilesPath: %(WebConfigFiles.FullPath)" Importance="high"></Message> 
<!--read applicationId and applicationName nodes from web.config if it exists-->
  <XmlPeek XmlInputPath="%(WebConfigFiles.FullPath)" Query="//appSettings/add" >
      <Output TaskParameter ="Result" PropertyName="Peeked" />        
  </XmlPeek>
  <Message Text="From Peek: $(Peeked)"></Message>
<!--Load new node into Property-->
  <PropertyGroup>         
      <ApplicationId>ApplicationId</ApplicationId>
      <ApplicationIdVal>100</ApplicationIdVal>
      <NewNode>&lt;add key&#61;&quot;$(ApplicationId)&quot; value&#61;&quot;$(ApplicationIdVal)&quot; /&gt;</NewNode>                         
      <!-- Concatenate existing and new node into a Property -->
      <ConcatenatedNodes>$(Peeked)$(NewNode)</ConcatenatedNodes>          
      <!--in the concatenatednode, remove semicolon-->
      <ChangedPeek>$(ConcatenatedNodes.Replace(";",""))</ChangedPeek>         
  </PropertyGroup>
  <Message Text="New pacakges: $(ChangedPeek)"></Message>
<!-- Replace existing nodes with concatenated nodes-->
 <XmlPoke XmlInputPath="%(WebConfigFilesSolutionDir.FullPath)" Query="//appSettings" Value="$(ChangedPeek)" />

Единственная полезная ссылка для добавления нового ключа в web.config: Как я могу использовать задачи MSBuild 'afterbuild' для редактирования файла.config? Мое решение построено на этом.

Другие вопросы по тегам