【发布时间】:2014-06-23 16:33:36
【问题描述】:
我正在使用MSBuild 来操作我的项目 (.csproj) 文件以更新对静态文件的引用。静态文件将由我的 CI 服务器 (TeamCity) 构建,然后需要在构建项目本身之前更新项目使用的引用。
这是我的 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="<Namespace Prefix='n'
Uri='http://schemas.microsoft.com/developer/msbuild/2003'
Name='DoNotKnowWhatThisIsFor-ButItIsRequired' />" >
</XmlPoke>
</Target>
但是当我运行它时,我会收到消息0 replacements。
所以我添加了一个 XmlPeek 任务来测试查询:
<XmlPeek
XmlInputPath="$(MSBuildProjectFile)"
Query="/n:Project/n:ItemGroup/
n:Content[starts-with(@Include, 'packages')]/@Include"
Namespaces="<Namespace Prefix='n'
Uri='http://schemas.microsoft.com/developer/msbuild/2003'
Name='DoNotKnowWhatThisIsFor-ButItIsRequired' />">
<Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>
<Message Text="Text: @(Peeked)"/>
当我运行 MSBuild 时,XmlPeek 能够读取 Xml:
Text: packages\pMixins.0.1.7.nupkg
查询与exactly相同! Why can't XmlPoke manipulate the Xml if XmlPeek can read it?
更新
玩了几个小时后,我终于找到了一个 XPath 查询,它可以让 XmlPoke 做我想做的事:
Query="//n:Project/n:ItemGroup/
n:Content[starts-with(@Include, 'packages')]/n:IncludeInVSIX/../@Include"
为什么要加/n:IncludeInVSIX/..?这是bug吗??
【问题讨论】:
-
我认为这个问题的标题是一个错误。
-
没错!很好,很抱歉。
-
哇,这里我想为什么要先下一个元素,然后回溯,然后获取属性?它有效,没有任何意义,但它有效。谢谢!