【问题标题】:Xmlpoke to add multiple appsettings key doesn't workXmlpoke 添加多个 appsettings 键不起作用
【发布时间】:2019-06-25 16:26:14
【问题描述】:

我有一个 Msbuild 目标,它通过将一个名为“ProjectID”的键添加到 web.config 的 appsetting 部分而成功执行。现在通过向同一个 appsetting 部分再添加一个键“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>

目标代码:

<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>

观察到的输出日志:

使用程序集“Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”中的“XmlPoke”任务。 2019-06-25 08:37:13,202 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 任务“XmlPoke” 2019-06-25 08:37:13,203 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 将“值”替换为“4424cc12-4368-45ad-ad5b-19e821eb91d4”。 2019-06-25 08:37:13,203 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 更换了 1 个。 2019-06-25 08:37:13,204 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 完成执行任务“XmlPoke”。 2019-06-25 08:37:13,204 [9] 调试 EP.BuildService.Handlers.ProjectBuildLogger [2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca] - 任务“XmlPoke” 2019-06-25 08:37:13,204 [9] 调试 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. 最初是在 PropertyGroup 中传递 ApplicationId 值。它 没有帮助。
  2. 所以硬编码代码中看到的值, Value="SetAValue" 仍然没有为 appsetting 添加密钥。

【问题讨论】:

    标签: c# xpath msbuild msbuild-target xmlpoke


    【解决方案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 添加新密钥的唯一有用参考是 How can I use MSBuild 'afterbuild' tasks to edit a .config file? 我的解决方案就是在此基础上构建的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多