我需要在tfspreview中获取ChangeSetId以进行持续集成。我只需要这个单号。我尝试了所有可能找到的MSBuild任务,但总会有另一个小问题阻止我。
对于MSBuild.ExtensionPack.Tfs.TeamBuild
我得到:
Could not load file or assembly 'Microsoft.TeamFoundation.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
和社区包中的TfsClient -task
(生成以下exec:tf.exe history . /StopAfter:1 /noprompt /format:detailed /recursive
)我得到:
The specified task executable could not be run. The system cannot find the file specified
我的问题是;
是否可以在tfspreview服务器上执行TF.exe
?
或者我可以在构建服务器上获取程序集Microsoft.TeamFoundation.Client
来执行这两个任务之一吗?
答案 0 :(得分:7)
好吧,我在这里告诉你,如果不编写自己的自定义任务,使用API等,这是可能的......在StackOverflow上有很多文章,但有解决方案的文章似乎不起作用对于TFS 2010.我只花了一整天的时间撞在墙上:D
您需要安装MSBuild社区任务。确保从这里获得最新版本:https://github.com/loresoft/msbuildtasks。最新版似乎已针对TFS 2010程序集进行了更新和重建。
您将使用MSBuild.Community.Tasks.Tfs.TfsClient任务。您收到有关无法运行可执行文件的错误的原因是因为这是一个MSBuild ToolTask,您需要将可执行文件的路径作为属性(ToolPath)传递给任务。
TfsClient任务只是tf.exe的包装器,并且该任务缺少以MSbuild-y方式处理交换机的许多可能功能。 (并且此任务的文档是不存在的 - 我必须查看代码)幸运的是,我发现您可以输入所有命令行开关作为命令本身的一部分。
所以你最后的电话会是这样的......
<MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="$(PathToTfTool)"
Command="history /collection:$(TfsProjectCollectionUrl) /stopafter:1 /version:T /format:detailed $(VersionControlPathForBuildWorkspace)"
Recursive="true"
>
<Message Text="TFS ChangeSetNumber: $(ChangesetNumber)" />
在22个悲惨的失败构建或构建没有数据之后我终于得到了...... TFS ChangeSetNumber:41
YAHOO!
得到马丁伍德沃德的命令: http://www.woodwardweb.com/vsts/determining_the.html 请确保您使用/详细的开关或它返回CHANGESET。我不得不查看该任务的代码,并弄清楚它是如何解析tf.exe的输出来解决这个问题的。
TfsClient的代码在这里供参考: https://github.com/loresoft/msbuildtasks/blob/master/Source/MSBuild.Community.Tasks/Tfs/TfsClient.cs
答案 1 :(得分:2)
以下是为我工作的代码行......经过几个小时和几次尝试。区别在于我在其中创建了一个输出TaskParameter元素
其中:
ToolPath =“C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ IDE“ - 取决于你是32位还是64位。
我的工作区路径的$ / WorkspacePath名称,您可以使用tf workspace命令查看此命令
<MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE"
Command="history /s:http://tfsserver01:8080/tfs/collectionname /stopafter:1 /version:T /format:detailed $/WorkspacePath"
Recursive="true" >
<Output TaskParameter="Changeset" PropertyName="ChangesetNumber"/>
</MSBuild.Community.Tasks.Tfs.TfsClient>
<Message Text="TFS ChangeSetNumber: $(ChangesetNumber)" />
但是感谢这个帖子
答案 2 :(得分:0)
MSBUILD工作流程到底是什么样的?您是将这个参数传递给MSBUILD还是某些自定义组件在MSBUILD运行时获取此信息?
我遇到过班级InformationNodeConverters,其中GetAssociatedChangesets方法接收IBuildDetail并返回IChangesetSummary列表。这还需要在进入MSBUILD任务之前已将关联集更改为关联。我今晚需要检查我的TFSPreview实例,看看我是否可以编辑构建模板,但我怀疑你应该可以使用这样的东西。