我使用MSBuild来操作我的项目(.csproj)文件,以更新对静态文件的引用。静态文件将由我的CI服务器(TeamCity)构建,然后在构建项目本身之前,需要更新项目使用的引用。
下面是csproj文件(全版)中的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/..?这是个窃听器吗?
发布于 2015-05-14 17:52:24
我只想向其他遇到这种情况的人确认,这实际上是如何避免在XmlPeek任务和XmlPoke任务中不能使用相同的XmlPeek查询的问题。
用于替换常规AppSettings中web.config元素的"file“属性值的原始查询:
<appSettings file="devsettings.config">
<add key="BuildVersion" value="" />
</appSettings>为了获得XmlPeek任务中的"file“属性,我使用了以下XPath查询:
//appSettings@file=‘devSetings.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
微软.NET框架,4.0.30319.18444版本
可能是虫子?但绝对是奇怪的行为。
https://stackoverflow.com/questions/24370918
复制相似问题