我现在已经在网上搜索了大约2天。也许我没有使用正确的条款。我想做的是使用当前的TFS ChangeSet变量avaliable编译我的项目。我没有使用TFS Build。
我唯一没有成功的尝试是使用MSBuild Extension Pack的MSBuild任务来获取当前的ChangeSet(不仅是并将其放入程序集版本(修订版)。它因为我不使用而失败建立...... Here is the sample i have try
这是我第一次使用这种“任务”类编程,我不知道我是否可以在不设置TFS构建的情况下完成此操作。我无法设置Builds,因为我使用外部dll和项目,希望设置似乎很复杂。 (我的下一步是检查有关TFS Builds的更多信息)......
我在运行时需要这个值,这是因为我在错误报告功能中需要这个值。我希望自动完成此过程以避免错误。
(Visual Studio 2013,TFS [VisualStudio.com],Asp.net MVC 5)
解决方案: 坦克到朱利奥维安
这将获取当前解决方案的TFS ChangeSet,而不是最新的,并将其写入文件“TFS.cs”。 输出文件如下所示:
static class TFS { public static string ChangeSet { get { return "436"; }}}
我在项目的根目录中创建了一个文件“TFS.targets”:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
add this line to Target to run this only on Release:
Condition="'$(Configuration)' == 'Release'" -->
<Target Name="BeforeBuild" >
<!-- Get information on the latest build -->
<Message Importance="High" Text="Getting TFS Chanset"/>
<Exec Command=""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\tf.exe" info "$(SolutionPath)" | FIND "Changeset"" ConsoleToMSBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="ChangesetLine" />
</Exec>
<PropertyGroup>
<ChangesetNumber>$(ChangesetLine.Substring(13, $([MSBuild]::Subtract( $(ChangesetLine.IndexOf(';')) , 13 ))))</ChangesetNumber>
</PropertyGroup>
<Message Importance="High" Text="ChangeSet: '$(ChangesetNumber)'. Writing TFS.cs ..."/>
<Exec Command="echo static class TFS { public static string ChangeSet { get { return "$(ChangesetNumber)"; }}} > TFS.cs" Outputs="TFS.cs">
<!--Add this file to the list to compile-->
<!--<Output ItemName="Compile" TaskParameter="Outputs" />-->
</Exec>
</Target>
</Project>
然后我编辑了项目文件并在Project节点中添加了这一行:
<Import Project="$(MSBuildProjectDirectory)\TFS.targets"/>
(搜索“导入项目”,你会在项目中找到一些)
在第一次构建时,该文件将不在您的项目中。所以包括它来使用它。 (显示所有文件)。
如果您希望将其包含在版本中,请使用this question中的代码替换exec echo,但您需要安装MSBuildCommunityTasks
其他更新
经过一些测试后,它似乎没有显示目录/解决方案的最后一个ChangeSet。正确的命令是
tf history "c:\YourSolutionDir" /noprompt /recursive /stopafter:1
这个问题是它给你一个很难用MsBuild提取的响应。
我已经写了一个只返回变更集的控制台应用程序:
static void Main(string[] args)
{
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\tf.exe";
p.StartInfo.Arguments = "history \"" + args[0] + "\" /noprompt /recursive /stopafter:1";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
var lines = output.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries);
var last = lines.Last();
var s = last.Split(' ');
Console.WriteLine(s[0]);
}
答案 0 :(得分:1)
TeamBuild任务只能检索TFS构建的ChangeSet。你说你还没有使用TFS版本,所以不会工作。
您可以使用TFS API从TFS中提取变更集。
老实说,如果你打算去那,那将比使用TFS构建系统更困难。
答案 1 :(得分:1)
您可以调用tf
命令获取有关TFVC文件和文件夹的信息。通过在映射到工作空间的本地目录中运行tf info
命令,您可以获得大量有用的数据,例如
Local information:
Local path : D:\Workspaces\xyz\mine.sln
Server path: $/DefaultCollection/xyz/mine.sln
Changeset : 6611
Change : none
Type : file
Server information:
Server path : $/DefaultCollection/xyz/mine.sln
Changeset : 6611
Deletion ID : 0
Lock : none
Lock owner :
Last modified: Saturday, March 14, 2015 09:38:44
Type : file
File type : utf-8
Size : 1994
将命令嵌入MSBuild文件并不难,如下面的代码段所示
<Exec Command="tf info "$(myChangesSetReferenceFile)" | FIND "Changeset"" ConsoleToMSBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="ChangesetLine" />
</Exec>
<PropertyGroup>
<ChangesetNumber>$(ChangesetLine.Substring(13, $([MSBuild]::Subtract( $(ChangesetLine.IndexOf(';')) , 13 ))))</ChangesetNumber>
</PropertyGroup>
tf
命令随团队资源管理器一起安装。