以编程方式检索源文件夹列表,如果不存在,则创建一个-C#+VSTS 2017



我正在尝试自动化一些流程,让生活变得更轻松。我们收到了来自团队的多个请求,要求在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>();

这引发了一个异常:转换值"时出错;系统安全最重要的WindowsIdentity"键入"Microsoft"。VisualStudio。服务。身份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。

更新:

要使用客户端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:显示带有文件夹和文件的项目结构,包括它们的ChangeType(签出、删除、重命名(,如visual studio 中所示

最新更新