以编程方式检索源文件夹列表并创建一个(如果不存在) - 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:如何以编程方式创建帖子并在之前检查重复项

以编程方式创建和更新 HLS 播放列表

在Java中以编程方式创建一个sql序列[关闭]

以编程方式将列表视图添加到 Sharepoint 2013 C# 中的所有列表

Xamarin-如何以编程方式扩展列表视图?