我使用MSBuild
来操作我的Project(.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/..
?这是一个错误吗?
答案 0 :(得分:1)
只是想确认遇到此问题的其他人,事实上,这就是解决了无法在XmlPeek任务和XmlPoke任务中使用相同的XPath查询的问题。
原始查询替换&#34;文件&#34;常规web.config中的AppSettings元素的属性值:
<appSettings file="devsettings.config">
<add key="BuildVersion" value="" />
</appSettings>
获取&#34;文件&#34;我在XPath查询后使用的XmlPeek任务中的属性:
//的appSettings [@file =&#39; devsettings.config&#39;] / @文件
然而,同样的查询在XmlPoke任务中不起作用。相反,以下工作就像@ philip-pittle在他对问题的更新中发现的那样
//的appSettings [@file =&#39; devsettings.config&#39;]的 /添加/..强> / @文件
<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)Build Engine版本12.0.31101.0
[Microsoft .NET Framework,版本4.0.30319.18444]
可能是个错误吗?但绝对是奇怪的行为。