首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加多个应用程序设置键的Xmlpoke不工作

添加多个应用程序设置键的Xmlpoke不工作
EN

Stack Overflow用户
提问于 2019-06-25 16:26:14
回答 1查看 436关注 0票数 1

我有一个Msbuild目标,它通过将一个名为'ProjectID‘的键添加到web.config的adding部分来成功地执行。现在,通过在相同的应用部分中添加一个键'ApplicationId‘来改变这个目标的行为。日志显示xmlpoke是为两者执行的。但是只有projectID值被正确地替换为每次运行。

(摘自)PropertyGroup定义:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<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“中的”Microsoft.Build.Tasks.Core“任务。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 DEBUG EP.BuildService.Handlers.ProjectBuildLogger 2e0de09a-3 fd8-4932-bc1d-e3a66dd3c1ca-替换"value”改为“value”,改为2019-06-2508:37:13,203 9调试EP.BuildService.Handlers.ProjectBuildLogger 2e0dea-3 fd8-4932-bc1d-e3a663ddc1ca- Made 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-3 fd8-4932-bc1d-e3a66dd3c1ca-作出0替换(S)。2019-06-25 08:37:13,204 9调试EP.BuildService.Handlers.ProjectBuildLogger 2e0de09a-3fd8-4932-bc1d-e3a66dd3c1ca -完成了执行任务"XmlPoke"。

到目前为止我尝试过的:

  1. 最初是在ApplicationId中传递PropertyGroup值。没什么用。
  2. 因此,硬编码代码中看到的值,Value="SetAValue“仍然没有为追加添加键。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 18:24:59

结果显示,xpath查询语法中的“add”没有添加键。相反,如果存在键,则添加或替换键的值。虽然这不能解决我在构建过程中添加应用程序设置键的问题,但它至少使我清楚地了解了“添加”有用链接的能力: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的结合使得它几乎可以工作,但是在清理编写的数据方面做了更多的工作。

代码语言:javascript
复制
<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? --我的解决方案就是在此基础上构建的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56758367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档