我正在创建一个 Visual Studio 2013 包 (vsix)(无耻插件:pMixins)。作为我使用 TeamCity 的一部分作为持续集成服务器,我已配置 Team City 来构建 .vsix 包 (Visual Studio Package (vsix) - Team City without Visual Studio installed)。
现在我想配置 Team City 以在 VSIX Schema 中设置版本:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest
Version="2.0.0"
xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011"
xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Version="1.0" Language="en-US" Publisher="Company" />
遵循 Using msbuild I want to update a config file with values from teamcity 中的建议和 How do I update an XML attribute from an MSBuild script?我更新了
Microsoft.VsSDK.targets
使用 XmlPoke具有以下目标:<Target
Name="UpdateVSIXVersion"
BeforeTargets="PrepareForBuild"
Condition="$(VSIXVersion) != '' And $(VSIXVersion) != '*Undefined*'">
<Message Text= "Updating VSIX Version" />
<XmlPoke
XmlInputPath="source.extension.vsixmanifest"
Query="/PackageManifest/Metadata/Identity/@Version"
Value="$(VSIXVersion)">
</XmlPoke>
</Target>
我使用系统参数更新了 Team City 以设置
VSIXVersion
:但是,当我检查 TeamCity 时,它进行了 0 次替换:
如何让 Team City 正确更新 .vsixmanifest xml?
最佳答案
经过大量搜索,我终于发现 XmlPoke 需要 namespace
当 Xml 文件包含命名空间时,即使对于默认命名空间 ( Modifying .config File in an MSBuild Project )。
但是,我找不到 XmlPoke.Namespaces
的任何文档。参数和上面引用的代码不起作用。经过多次尝试一个错误,我终于让它与这个一起工作:
<Target
Name="UpdateVSIXVersion"
BeforeTargets="PrepareForBuild"
Condition="$(VSIXVersion) != '' And $(VSIXVersion) != '*Undefined*'">
<Message Text= "Updating VSIX Version" />
<XmlPoke
XmlInputPath="source.extension.vsixmanifest"
Query="/n:PackageManifest/n:Metadata/n:Identity/@Version"
Value="$(VSIXVersion)"
Namespaces="<Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/vsx-schema/2011' Name='DoNotKnowWhatThisIsFor-ButItIsRequired' />">
</XmlPoke>
备注:
如果有人需要,MSBuild 文件在 Github 上:https://github.com/ppittle/pMixins/blob/master/tools/vssdk_tools/v12.0/VSSDK/Microsoft.VsSDK.targets
关于xpath - 更新 Xml 文件 (vsixmanifest),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328738/