Encontrei um arquivo chamado "degit" no código-fonte do Remotion.
Remotion ajuda você a fazer vídeos programaticamente.
Neste artigo, veremos os seguintes conceitos:
Lembro-me de ter visto "degit" mencionado em um dos Leiames do código aberto, mas não conseguia lembrar qual repositório era, então pesquisei no Google o que significa um degit e encontrei este pacote degit npm.
Em termos simples, você pode usar degit para fazer rapidamente uma cópia de um repositório Github baixando apenas o commit mais recente
em vez de todo o histórico do git.
Visite o pacote npm oficial para degit para ler mais sobre este pacote.
Você também pode usar este pacote degit para baixar repositórios do Gitlab ou Bitbucket, para que não se limite apenas aos repositórios do Github.
# download from GitLab degit gitlab:user/repo # download from BitBucket degit bitbucket:user/repo degit user/repo # these commands are equivalent degit github:user/repo
Aqui está um exemplo de uso em Javascript:
const degit = require('degit'); const emitter = degit('user/repo', { cache: true, force: true, verbose: true, }); emitter.on('info', info => { console.log(info.message); }); emitter.clone('path/to/dest').then(() => { console.log('done'); });
Para entender como construir uma função degit simples, vamos analisar o código do arquivo degit.ts do Remotion. Este arquivo implementa uma versão básica do que o pacote degit npm faz: buscar o estado mais recente de um repositório GitHub sem baixar o histórico completo.
import https from 'https'; import fs from 'node:fs'; import {tmpdir} from 'node:os'; import path from 'node:path'; import tar from 'tar'; import {mkdirp} from './mkdirp';
export function fetch(url: string, dest: string) { return new Promise((resolve, reject) => { https.get(url, (response) => { const code = response.statusCode as number; if (code >= 400) { reject( new Error( `Network request to ${url} failed with code ${code} (${response.statusMessage})`, ), ); } else if (code >= 300) { fetch(response.headers.location as string, dest) .then(resolve) .catch(reject); } else { response .pipe(fs.createWriteStream(dest)) .on('finish', () => resolve()) .on('error', reject); } }).on('error', reject); }); }
Após baixar o repositório, é necessário extrair o conteúdo do tarball:
function untar(file: string, dest: string) { return tar.extract( { file, strip: 1, C: dest, }, [], ); }
A principal função degit une tudo, lidando com a criação de diretório, busca e extração do repositório:
export const degit = async ({ repoOrg, repoName, dest, }: { repoOrg: string; repoName: string; dest: string; }) => { const base = path.join(tmpdir(), '.degit'); const dir = path.join(base, repoOrg, repoName); const file = `${dir}/HEAD.tar.gz`; const url = `https://github.com/${repoOrg}/${repoName}/archive/HEAD.tar.gz`; mkdirp(path.dirname(file)); await fetch(url, file); mkdirp(dest); await untar(file, dest); fs.unlinkSync(file); };
mkdirp é usado para criar
um diretório recursivamente.
Descobri que o remotion usa degit para baixar modelos quando você executa o comando de instalação:
npx create-video@latest
Este comando pede que você escolha um modelo, é aqui que o degit entra em ação para fazer o download
o último commit do modelo selecionado
Você pode verificar este código no pacote create-video como prova.
Receba cursos gratuitos inspirados nas melhores práticas usadas em código aberto.
Site: https://ramunarasinga.com/
Linkedin: https://www.linkedin.com/in/ramu-narasinga-189361128/
Github: https://github.com/Ramu-Narasinga
E-mail: [email protected]
Aprenda as práticas recomendadas usadas em código aberto.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3