Ich habe im Remotion-Quellcode eine Datei namens „degit“ gefunden.
Mit Remotion können Sie Videos programmatisch erstellen.
In diesem Artikel werden wir uns mit den folgenden Konzepten befassen:
Ich erinnere mich, dass „degit“ in einer der Readmes in der Open Source erwähnt wurde, aber ich konnte mich nicht erinnern, um welches Repository es sich handelte, also habe ich gegoogelt, was ein degit bedeutet, und habe dieses degit npm-Paket gefunden.
Einfach ausgedrückt: Sie können degit verwenden, um schnell eine Kopie eines Github-Repositorys zu erstellen, indem Sie nur das neueste Commit herunterladen
statt der gesamten Git-Historie.
Besuchen Sie das offizielle npm-Paket für degit, um mehr über dieses Paket zu erfahren.
Sie können dieses Degit-Paket auch zum Herunterladen von Repos von Gitlab oder Bitbucket verwenden, sodass es nicht nur auf Github-Repositories beschränkt ist.
# 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
Hier ist ein Beispiel für die Verwendung in 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'); });
Um zu verstehen, wie man eine einfache Degit-Funktion erstellt, analysieren wir den Code aus der degit.ts-Datei von Remotion. Diese Datei implementiert eine Basisversion dessen, was das degit npm-Paket tut: den neuesten Status eines GitHub-Repositorys abrufen, ohne den vollständigen Verlauf herunterzuladen.
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<void>((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); }); }
Nach dem Herunterladen des Repositorys ist es notwendig, den Inhalt des Tarballs zu extrahieren:
function untar(file: string, dest: string) { return tar.extract( { file, strip: 1, C: dest, }, [], ); }
Die Hauptfunktion von degit verbindet alles miteinander und kümmert sich um die Verzeichniserstellung, das Abrufen und Extrahieren des Repositorys:
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 wird zum Erstellen verwendet
a Verzeichnisse rekursiv.
Ich habe herausgefunden, dass Remotion Degit zum Herunterladen von Vorlagen verwendet, wenn Sie den Installationsbefehl ausführen:
npx create-video@latest
Mit diesem Befehl werden Sie aufgefordert, eine Vorlage auszuwählen. Hier kommt degit zum Herunterladen ins Spiel
das letzte Commit der ausgewählten Vorlage
Sie können diesen Code im Paket „create-video“ als Beweis überprüfen.
Erhalten Sie kostenlose Kurse, die von den Best Practices inspiriert sind, die in Open Source verwendet werden.
Website: https://ramunarasinga.com/
Linkedin: https://www.linkedin.com/in/ramu-narasinga-189361128/
Github: https://github.com/Ramu-Narasinga
E-Mail: ramu.narasinga@gmail.com
Lernen Sie die Best Practices kennen, die in Open Source verwendet werden.
Das obige ist der detaillierte Inhalt vonVerwenden Sie degit, um eine Vorlage in Ihrem CLI-Tool herunterzuladen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!