我需要从chageset获取已更改文件的列表,并排除所有其他垃圾。
我可以从命令tf changeset / i $(changesetnumber)获取此信息,但除了文件列表之外,我还有很多其他信息,我不需要这些信息用于我的目的。
或许有人可以告诉我如何从ccnet获取这个文件列表,这样我就可以通过属性将它发送到我的msbuild.proj文件。
答案 0 :(得分:9)
您可以使用TFS API获取所需的信息。这是一些示例C#代码,它将选择所有已编辑,添加和删除的文件的文件名
Uri serverUri = new Uri("http://mytfsserver:8080/");
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(serverUri);
tpc.EnsureAuthenticated();
VersionControlServer vcs = tpc.GetService<VersionControlServer>();
var changeset = vcs.GetChangeset(changesetId);
var changedFiles = from change in changeset.Changes where
( (change.ChangeType & ChangeType.Edit) == ChangeType.Edit
|| (change.ChangeType & ChangeType.Add) == ChangeType.Add
|| (change.ChangeType & ChangeType.Delete) == ChangeType.Delete)
select change.Item.ServerItem;
我担心我没有使用过cc.net,因此无法建议将其集成到ccnet中的最佳方法,但您可以将其编译成一个小实用程序或用脚本语言重写它(例如Powershell, IronPython的)
答案 1 :(得分:0)
您可以使用CCNET的Modification Writer Task。将它放到CCNET配置的<prebuild>
部分,并在<msbuild>
任务中处理生成的文件:
<Project DefaultTargets="Go" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Go">
<XmlPeek
XmlInputPath="$(CCNetArtifactDirectory)\modifications.xml"
Query="/ArrayOfModification/Modification">
<Output TaskParameter="Result" ItemName="Modifications" />
</XmlPeek>
<MSBuild
Projects="$(MSBuildProjectFile)"
Properties="Modification=%(Modifications.Identity)"
Targets="MessageModificationPath">
</MSBuild>
</Target>
<Target Name="MessageModificationPath">
<XmlPeek
XmlContent="$(Modification)"
Query="/Modification/FolderName/text()">
<Output TaskParameter="Result" PropertyName="FolderName" />
</XmlPeek>
<XmlPeek
XmlContent="$(Modification)"
Query="/Modification/FileName/text()">
<Output TaskParameter="Result" PropertyName="FileName" />
</XmlPeek>
<Message Text="$(FolderName)$(FileName)" />
</Target>
</Project>
注意:我在MSBuild方面并不是很有经验,因此非常感谢您提供有关如何以更优雅的方式解析XML输出的任何建议。
提示:<XmlPeek>
任务需要.NET 4.0 MSBuild。