gpt4 book ai didi

c# - MSBuild - XPath - XmlPeek 可以读取但 XmlPoke 不能写入

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:40 27 4
gpt4 key购买 nike

我正在使用 MSBuild 来操作我的项目 (.csproj) 文件以更新对静态文件的引用。静态文件将由我的 CI 服务器 (TeamCity) 构建,然后需要在构建项目本身之前更新项目使用的引用。

这是来 self 的 csproj 文件 ( full version ) 的 Xml 示例:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="12.0">
<ItemGroup>
<Content Include="packages\pMixins.0.1.7.nupkg">
<IncludeInVSIX>true</IncludeInVSIX>
</Content>

我已经编写了一个 MSBuild 任务:

<Target Name="ReplaceNugetPackageDependency" BeforeTargets="PrepareForBuild" >
<XmlPoke
XmlInputPath="$(MSBuildProjectFile)"
Query="//n:Project/n:ItemGroup/
n:Content[starts-with(@Include, 'packages')]/@Include"
Value="TEST-TEST"
Namespaces="&lt;Namespace Prefix='n'
Uri='http://schemas.microsoft.com/developer/msbuild/2003'
Name='DoNotKnowWhatThisIsFor-ButItIsRequired' /&gt;" >
</XmlPoke>
</Target>

但是当我运行它时,我收到消息 0 replacements

所以我添加了一个 XmlPeek 任务来测试查询:

<XmlPeek 
XmlInputPath="$(MSBuildProjectFile)"
Query="/n:Project/n:ItemGroup/
n:Content[starts-with(@Include, 'packages')]/@Include"
Namespaces="&lt;Namespace Prefix='n'
Uri='http://schemas.microsoft.com/developer/msbuild/2003'
Name='DoNotKnowWhatThisIsFor-ButItIsRequired' /&gt;">
<Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>
<Message Text="Text: @(Peeked)"/>

当我运行 MSBuild XmlPeek 时能够读取 Xml:

 Text: packages\pMixins.0.1.7.nupkg

查询完全相同! 如果 XmlPeek 可以读取 Xml,为什么 XmlPoke 不能操作它?

更新

玩了几个小时之后,我终于找到了一个 XPath 查询,它将让 XmlPoke 执行我想要的操作:

Query="//n:Project/n:ItemGroup/
n:Content[starts-with(@Include, 'packages')]/n:IncludeInVSIX/../@Include"

为什么要添加/n:IncludeInVSIX/..?这是一个错误吗??

最佳答案

只是想向遇到此问题的任何其他人确认,事实上,这就是您如何解决无法在 XmlPeek 任务和 XmlPoke 任务中使用完全相同的 XPath 查询的问题。

替换常规 web.config 中 AppSettings 元素的"file"属性值的原始查询:

  <appSettings file="devsettings.config">
<add key="BuildVersion" value="" />
</appSettings>

为了获取 XmlPeek 任务中的"file"属性,我使用了以下 XPath 查询:

//appSettings[@file='devsettings.config']/@file

但是,同样的查询在 XmlPoke 任务中不起作用。相反,下面的工作就像@philip-pittle 在他对问题的更新中发现的那样

//appSettings[@file='devsettings.config']/add/../@file

  <XmlPeek XmlInputPath="$(_BuildPath)web.config"
Query="//appSettings[@file='devsettings.config']/@file">
<Output TaskParameter="Result" ItemName="ExistingPeeked" />
</XmlPeek>
<XmlPoke XmlInputPath="$(_BuildPath)web.config"
Query="//appSettings[@file='devsettings.config']/add/../@file"
Value="$(_EnvironmentConfig)" />

这是使用以下版本的 MSBuild。

Microsoft (R) 构建引擎版本 12.0.31101.0

[Microsoft .NET Framework,版本 4.0.30319.18444]

这可能是一个错误?但绝对是奇怪的行为。

关于c# - MSBuild - XPath - XmlPeek 可以读取但 XmlPoke 不能写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com