Xmlpoke для добавления нескольких ключей appsettings не работает - PullRequest
0 голосов
/ 25 июня 2019

У меня есть цель 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-19e821eb91d9" *. 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. Так что жестко закодировать значение, как видно из кода, Значение = "SetAValue" все еще не добавляет ключ к настройке приложения.

1 Ответ

0 голосов
/ 25 июня 2019

Оказывается, «Добавить» в синтаксисе запроса 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? Мое решение построено на этом.

...