使用 Octokit.net 从 GitHub 存储库下载最新版本
Downloading Latest Release from a GitHub Repository using Octokit.net
如何使用 Octokit.net 以编程方式将私有存储库的最新版本下载为 zip 文件?
我不想下载整个存储库,只是下载指定版本的源代码,例如最新版本。
到目前为止,我已经创建了一个使用 GitHubToken 授权的 GitHubClient,并且我已经获得了 repo 中所有版本的列表。我可以获得有关最新版本的信息,例如名称、标签、Url 和 ZipballUrl 等
我尝试使用 ZipballUrl 下载该版本,但它return 不是有效的 zip。
在我下面的代码中,我尝试从 Octokit 存储库下载最新版本。
String workspaceName = "octokit";
String repositoryName = "octokit.net";
String filename = "temp.zip";
var client = new GitHubClient(new ProductHeaderValue(repositoryName));
String GitHubToken = "--- token goes here ---";
var tokenAuth = new Credentials(GitHubToken);
client.Credentials = tokenAuth;
// Retrieve a List of Releases in the Repository, and get latest using [0]-subscript
var releases = await client.Repository.Release.GetAll(workspaceName, repositoryName);
var latest = releases[0];
// Get a HttpResponse from the Zipball URL, which is then converted to a byte array
var response = await client.Connection.Get<object>(new Uri(latest.ZipballUrl), new Dictionary<string, string>(), "application/json");
byte[] releaseBytes = Encoding.ASCII.GetBytes(response.HttpResponse.Body.ToString());
// Create the resulting file using the byte array
await File.WriteAllBytesAsync(filename, releaseBytes);
我对 GitHubClient、Http- 或 WebClient 不是很熟悉,所以我无法判断错误是出在 HttpResponse 和我从那里获得的内容,还是文件写入过程中的其他任何地方。
已解决:
我无法使用 GitHubClient 完全解决这个问题,所以我仍然想知道这是否可行。
但是,在使用 Octokit 找到 ZipballUrl 后,我设法通过添加 WebClient 来处理下载来解决这个问题。这必须配置 User-Agent 和授权 headers 才能工作。
var latest = releases[0];
WebClient webClient = new WebClient();
webClient.Headers.Add("user-agent", "Anything");
webClient.Headers.Add("authorization", "token " + GitHubToken);
await webClient.DownloadFileTaskAsync(new Uri(latest.ZipballUrl), filename);
为了补充@haakonfp 自己对这个问题的回答,我想指出,GitHub API 不是 return 403,User-Agent请求 header 中需要 header。您可能仅在尝试访问私人仓库时才需要令牌,但在任何一种情况下,header 都将允许您下载发布内容。
var wc = new WebClient();
wc.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
wc.DownloadFile(latestVersion.ZipballUrl, "release.zip");
如何使用 Octokit.net 以编程方式将私有存储库的最新版本下载为 zip 文件?
我不想下载整个存储库,只是下载指定版本的源代码,例如最新版本。
到目前为止,我已经创建了一个使用 GitHubToken 授权的 GitHubClient,并且我已经获得了 repo 中所有版本的列表。我可以获得有关最新版本的信息,例如名称、标签、Url 和 ZipballUrl 等
我尝试使用 ZipballUrl 下载该版本,但它return 不是有效的 zip。
在我下面的代码中,我尝试从 Octokit 存储库下载最新版本。
String workspaceName = "octokit";
String repositoryName = "octokit.net";
String filename = "temp.zip";
var client = new GitHubClient(new ProductHeaderValue(repositoryName));
String GitHubToken = "--- token goes here ---";
var tokenAuth = new Credentials(GitHubToken);
client.Credentials = tokenAuth;
// Retrieve a List of Releases in the Repository, and get latest using [0]-subscript
var releases = await client.Repository.Release.GetAll(workspaceName, repositoryName);
var latest = releases[0];
// Get a HttpResponse from the Zipball URL, which is then converted to a byte array
var response = await client.Connection.Get<object>(new Uri(latest.ZipballUrl), new Dictionary<string, string>(), "application/json");
byte[] releaseBytes = Encoding.ASCII.GetBytes(response.HttpResponse.Body.ToString());
// Create the resulting file using the byte array
await File.WriteAllBytesAsync(filename, releaseBytes);
我对 GitHubClient、Http- 或 WebClient 不是很熟悉,所以我无法判断错误是出在 HttpResponse 和我从那里获得的内容,还是文件写入过程中的其他任何地方。
已解决:
我无法使用 GitHubClient 完全解决这个问题,所以我仍然想知道这是否可行。
但是,在使用 Octokit 找到 ZipballUrl 后,我设法通过添加 WebClient 来处理下载来解决这个问题。这必须配置 User-Agent 和授权 headers 才能工作。
var latest = releases[0];
WebClient webClient = new WebClient();
webClient.Headers.Add("user-agent", "Anything");
webClient.Headers.Add("authorization", "token " + GitHubToken);
await webClient.DownloadFileTaskAsync(new Uri(latest.ZipballUrl), filename);
为了补充@haakonfp 自己对这个问题的回答,我想指出,GitHub API 不是 return 403,User-Agent请求 header 中需要 header。您可能仅在尝试访问私人仓库时才需要令牌,但在任何一种情况下,header 都将允许您下载发布内容。
var wc = new WebClient();
wc.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
wc.DownloadFile(latestVersion.ZipballUrl, "release.zip");