Saya menjumpai fail bernama "degit" dalam kod sumber Remotion.
Remotion membantu anda membuat video secara terprogram.
Dalam artikel ini, kita akan melihat konsep berikut:
Saya masih ingat melihat "degit" yang disebut dalam salah satu Readmes dalam sumber terbuka, tetapi saya tidak dapat mengingat repositori mana itu jadi saya mencari di google maksud degit dan menemui pakej npm degit ini.
Secara ringkas, Anda boleh menggunakan degit untuk membuat salinan repositori Github dengan cepat dengan hanya memuat turun komit terkini
bukannya keseluruhan sejarah git.
Lawati pakej npm rasmi untuk degit untuk membaca lebih lanjut tentang pakej ini.
Anda boleh menggunakan pakej degit ini untuk memuat turun repo daripada Gitlab atau Bitbucket juga supaya ia tidak terhad kepada repositori Github sahaja.
# 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
Berikut ialah contoh penggunaan dalam 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'); });
Untuk memahami cara membina fungsi degit mudah, mari pecahkan kod daripada fail degit.ts Remotion. Fail ini melaksanakan versi asas perkara yang dilakukan oleh pakej degit npm: mengambil keadaan terkini repositori GitHub tanpa memuat turun sejarah penuh.
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); }); }
Selepas memuat turun repositori, anda perlu mengekstrak kandungan tarball:
function untar(file: string, dest: string) { return tar.extract( { file, strip: 1, C: dest, }, [], ); }
Fungsi degit utama menghubungkan semuanya bersama-sama, mengendalikan penciptaan direktori, mengambil dan mengekstrak repositori:
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 digunakan untuk mencipta
direktori secara rekursif.
Saya mendapati bahawa remotion menggunakan degit untuk memuat turun templat apabila anda menjalankan arahan pemasangannya:
npx create-video@latest
Arahan ini meminta anda memilih templat, di sinilah degit mula bertindak untuk memuat turun
komitmen terkini templat yang dipilih
Anda boleh menyemak kod ini daripada pakej cipta video untuk bukti.
Dapatkan kursus percuma yang diilhamkan oleh amalan terbaik yang digunakan dalam sumber terbuka.
Laman web: https://ramunarasinga.com/
Linkedin: https://www.linkedin.com/in/ramu-narasinga-189361128/
Github: https://github.com/Ramu-Narasinga
E-mel: ramu.narasinga@gmail.com
Ketahui amalan terbaik yang digunakan dalam sumber terbuka.
Atas ialah kandungan terperinci Gunakan degit untuk memuat turun templat dalam alat CLI anda.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!