以编程方式检索源文件夹列表并创建一个(如果不存在) - C# + VSTS 2017
Posted
技术标签:
【中文标题】以编程方式检索源文件夹列表并创建一个(如果不存在) - C# + VSTS 2017【英文标题】:Programmatically retrieve list of source folders and create one if not present - C# + VSTS 2017 【发布时间】:2021-01-26 22:55:32 【问题描述】:我正在尝试自动化一些流程以使生活更轻松。我们收到了来自团队的多个请求,要求在 TFS 2017 中创建一个文件夹(他们没有权限),然后为该源代码控制文件夹设置相关的构建。 构建创建部分我想我有办法,但查询我们的本地 TFS 2017 服务器以获取某个路径下的文件夹列表证明很棘手。到目前为止,我什至一开始就无法连接到服务器:
var collectionUri = "http://tfs-server:8080/tfs/DefaultCollection/";
var teamProjectName = "MYPROJECT";
Uri uri = new Uri(collectionUri);
var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "COLLECTIONNAME")));
var connection = new VssConnection(uri, clientCredentials);
var sourceControlServer = connection.GetClient<TfvcHttpClient>();
这会引发异常:转换值“System.Security.Principal.WindowsIdentity;”时出错键入“Microsoft.VisualStudio.Services.Identity.IdentityDescriptor”
谁能帮我先连接到服务器!这方面的文档很难找到,而且我没有看到任何实际工作的示例。
接下来我要看的是创建文件夹(如果它不存在)。还不知道怎么做,也许使用
sourceControlServer.GetBranchAsync(teamProjectName + FolderName);
谢谢!
编辑: 好的,我通过这样做而不是错误地创建连接:
Uri uri = new Uri("http://tfs-server:8080/tfs/DefaultCollection/");
var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN")));
var buildServer = new BuildHttpClient(uri, clientCredentials);
var sourceControlServer = new TfvcHttpClient(uri, clientCredentials);
所以现在只需弄清楚如何从 TFS 列出和创建文件夹并创建构建!
编辑:
所以我已经开始查询了,所以我可以检查一个文件夹是否存在于这样的路径下:
var teamProjectName = "USA";
Uri uri = new Uri("http://tfs-server:8080/tfs/DefaultCollection/");
var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN")));
TfvcHttpClient sourceControlServer = new TfvcHttpClient(uri, clientCredentials);
List<TfvcItem> branchItems;
using (sourceControlServer)
branchItems = sourceControlServer.GetItemsAsync("$/USA/Development/NewFolder", VersionControlRecursionType.OneLevel).Result;
return branchItems.Count > 0;
这将找到该文件夹下的所有项目。因此,如果没有文件夹,它将返回 0,所以我可以继续创建该文件夹。 所以下一个问题是如何创建文件夹。使用 CreateChangesetAsync。
【问题讨论】:
一个文件夹还是一个分支?那里有一个重要的区别。 所以我们有一个 3 分支结构。最初我只想在 dev 分支中创建文件夹。然后将该文件夹分支到下一个分支 main。然后直到释放。我基本上是在每个分支中创建空文件夹。所以我不确定我是否可以只创建这 3 个文件夹,如果没有分支就足够了。 【参考方案1】:更新:
要使用客户端 API 和 CreateChangesetAsync 方法在 TFVC 中创建文件,您可以参考以下示例控制台应用程序:
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
internal class Program
internal static async Task Main(string[] args)
var orgUrl = new Uri(args[0]);
string serverPath = args[1];
string localPath = args[2];
string contentType = args[3];
string pat = args[4];
var changes = new List<TfvcChange>()
new TfvcChange()
ChangeType = VersionControlChangeType.Add,
Item = new TfvcItem()
Path = serverPath,
ContentMetadata = new FileContentMetadata()
Encoding = Encoding.UTF8.WindowsCodePage,
ContentType = contentType,
,
NewContent = new ItemContent()
Content = Convert.ToBase64String(File.ReadAllBytes(localPath)),
ContentType = ItemContentType.Base64Encoded
;
var changeset = new TfvcChangeset()
Changes = changes,
Comment = $"Added serverPath from localPath"
;
var connection = new VssConnection(orgUrl, new VssBasicCredential(string.Empty, pat));
var tfvcClient = connection.GetClient<TfvcHttpClient>();
await tfvcClient.CreateChangesetAsync(changeset);
另外,请不要使用 tf 命令行,请在此处查看解决方案:
C# TFS API: show project structure with folders and files, including their ChangeType (checked out, deleted,renamed) like in visual studio
【讨论】:
我希望使用 TfvcHttpClient 来获取源中的文件夹。这将在天蓝色的功能应用程序中运行,因此我认为它不会对目录结构或工作区有任何了解。所以我认为 DIR 命令不会起作用。 您好 evolmonster,感谢您的热情回复。要使用 Client API 和 CreateChangesetAsync 方法在 TFVC 中创建文件,您可以查看更新部分: 嗨@evolmonster,有什么更新吗?你想清楚了吗? 我决定只知道源文件夹现在存在。我一直致力于在代码中创建构建,现在可以使用。经过多次试验和错误! @evolmonster 如果方便,您可以在此处分享解决方案。这也将帮助社区中的其他人。以上是关于以编程方式检索源文件夹列表并创建一个(如果不存在) - C# + VSTS 2017的主要内容,如果未能解决你的问题,请参考以下文章
创建具有甘特图的 Sharepoint 列表 - 以编程方式
Wordpress:如何以编程方式创建帖子并在之前检查重复项