Qual é a diferença entre um arquivo e um lançamento (codeload).
Este URL:
- https://github.com/yarnpkg/yarn/archive/v0.23.4.tar.gz = 12,6MB
- https://github.com/yarnpkg/yarn/releases/download/v0.23.4/yarn-v0.23.4.tar.gz = 3,8MB
- https://api.github.com/repos/yarnpkg/yarn/tarball/v0.23.4 = 12,6MB
Qual é a diferença? Algumas ferramentas estão me dizendo que eu posso baixar uma versão usando a API do github (coisas do codeload), mas o tamanho não é o mesmo para aqueles tar.gz?
O problema é que não posso baixar a versão "pequena" usando a API.
Respostas:
1 para resposta № 1O arquivo pequeno não contém todo o conjunto de testes ou seus acessórios. Isso é o que ocupa a maior parte do espaço.
$ du -sh __tests__
26M __tests__
Isso ocorre porque os dois arquivos grandes são mais oumenos empacotando o próprio repositório para download, enquanto o pacote configurável de release é um artefato construído que contém apenas o código de liberação. É produzido por scripts / build-dist.sh. Ele não contém nenhum dos testes, porque eles não são necessários na distribuição de versões (já testada).
Se você quiser buscar isso no Github usando a API, algo assim deve funcionar.
#!/usr/bin/env python3
import json
import requests
import shutil
headers = {"Accept": "application/vnd.github.v3+json"}
author_name = "yarnpkg"
repo_name = "yarn"
tag_name = "v0.23.4"
download_path = "/tmp/{}-{}.tar.gz".format(repo_name, tag_name)
# To get latest release, sub in this URL instead:
# /repos/:owner/:repo/releases/latest
r = requests.get(
"https://api.github.com/repos/{}/{}/releases/tags/{}".format(
author_name,
repo_name,
tag_name,
),
headers=headers)
if r.status_code == 200:
json_response = r.json()
for asset in json_response["assets"]:
if asset["name"] == "{}-{}.tar.gz".format(repo_name, tag_name):
download_url = asset["browser_download_url"]
print("Downloading to {}".format(download_path))
r2 = requests.get(download_url, stream=True)
with open(download_path, "wb") as out_file:
shutil.copyfileobj(r2.raw, out_file)
print("Download complete.")
else:
print("ERROR: GitHub response code {} unexpected.".format(
r.status_code
))
Você pode ler mais sobre isso no Documentação da API do GitHub.
Eu acho que você pode usar a API de dados do git para obter o conteúdo completo do repositório ... mas é muito mais fácil simplesmente usar o git clone nesse ponto?