我在Remotion原始碼中發現了一個名為「degit」的檔案。
Remotion 可協助您以程式設計方式製作影片。
在本文中,我們將了解以下概念:
我確實記得在開源的自述文件之一中提到過“degit”,但我不記得它是哪個存儲庫,所以我用谷歌搜索了 degit 的含義並找到了這個 degit npm 包。
簡單來說,您可以使用 degit 只需下載最新的提交即可快速複製 Github 儲存庫
而不是整個 git 歷史記錄。
訪問 degit 的官方 npm 包以了解有關此包的更多資訊。
您也可以使用此 degit 套件從 Gitlab 或 Bitbucket 下載儲存庫,因此它不僅限於 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
這是 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'); });
要了解如何建立簡單的 degit 函數,讓我們分解 Remotion 的 degit.ts 檔案中的程式碼。該檔案實作了 degit npm 套件的基本版本:取得 GitHub 儲存庫的最新狀態,而不下載完整的歷史記錄。
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); }); }
下載儲存庫後,需要擷取tarball的內容:
function untar(file: string, dest: string) { return tar.extract( { file, strip: 1, C: dest, }, [], ); }
主要 degit 函數將所有內容連結在一起,處理目錄建立、取得和提取儲存庫:
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 用於創建
遞歸地目錄。
我發現當您執行安裝命令時,remotion 使用 degit 下載範本:
npx create-video@latest
此命令要求您選擇一個模板,這是 degit 開始下載的地方
所選範本的最新提交
您可以從 create-video 套件中檢查此程式碼作為證明。
取得受開源最佳實踐啟發的免費課程。
網址:https://ramunarasinga.com/
Linkedin:https://www.linkedin.com/in/ramu-narasinga-189361128/
Github:https://github.com/Ramu-Narasinga
電子郵件:[email protected]
學習開源中使用的最佳實踐。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3