”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 degit 在 CLI 工具中下载模板。

使用 degit 在 CLI 工具中下载模板。

发布于2024-11-02
浏览:385

我在Remotion源代码中发现了一个名为“degit”的文件。
Remotion 可帮助您以编程方式制作视频。

在本文中,我们将了解以下概念:

  1. 什么是数字?
  2. 受 Remotion 的 degit 文件启发,构建一个简单的 degit 函数

什么是数字?

我确实记得在开源的自述文件之一中提到过“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');
});

受 Remotion 的 degit 文件启发,构建一个简单的 degit 函数

要了解如何构建简单的 degit 函数,让我们分解 Remotion 的 degit.ts 文件中的代码。该文件实现了 degit npm 包的基本版本:获取 GitHub 存储库的最新状态,而不下载完整的历史记录。

1.使用进口

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';
  • https:用于发出网络请求以获取存储库。
  • fs:与文件系统交互,比如写入下载的文件。
  • tmpdir:提供系统的临时目录路径。
  • path:处理和转换文件路径。
  • tar:提取 tarball(压缩文件)的内容。
  • mkdirp:递归创建目录的辅助函数,在单独的文件中提供。

2:获取存储库

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);
    });
}
  • URL处理:该函数检查请求是否成功(状态代码低​​于300)。 如果是重定向(代码在 300 到 399 之间),它将遵循新的 URL。 如果是错误(代码 400 ),则拒绝承诺。
  • 文件保存:使用 fs.createWriteStream 下载存储库并将其保存到目标路径。

3:提取存储库

下载存储库后,需要提取tarball的内容:

function untar(file: string, dest: string) {
    return tar.extract(
        {
            file,
            strip: 1,
            C: dest,
        },
        [],
    );
}
  • Tar Extraction:此函数将 .tar.gz 文件的内容提取到指定的目标目录中。

4:把它们放在一起

主要 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 包中检查此代码作为证明。

Use degit to download a template in your CLI tool.

获取受开源最佳实践启发的免费课程。

关于我:

网站:https://ramunarasinga.com/

Linkedin:https://www.linkedin.com/in/ramu-narasinga-189361128/

Github:https://github.com/Ramu-Narasinga

电子邮件:[email protected]

学习开源中使用的最佳实践。

参考:

  1. https://github.com/Rich-Harris/degit
  2. https://github.com/remotion-dev/remotion/blob/main/packages/create-video/src/degit.ts
  3. https://github.com/remotion-dev/remotion/blob/c535e676badd055187d1ea8007f9ac76ab0ad315/packages/create-video/src/init.ts#L109
  4. https://github.com/remotion-dev/remotion/blob/main/packages/create-video/src/mkdirp.ts
版本声明 本文转载于:https://dev.to/ramunarasinga/use-degit-to-download-a-template-in-your-cli-tool-6hg?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 JavaScript 中使用“setTimeout”时如何使用“this”保留上下文?
    在 JavaScript 中使用“setTimeout”时如何使用“this”保留上下文?
    在 JavaScript 中使用 setTimeout 并通过 this 保存上下文在 JavaScript 中使用 setTimeout 函数时,必须了解它如何处理这的背景。当在超时回调中调用不同上下文中定义的方法时,这一点变得特别重要。在提供的代码片段中,方法函数调用 method2,该方法根据...
    编程 发布于2024-11-09
  • 如何在 C++ 中安全地启动可执行文件:为什么 CreateProcess() 是您的最佳选择?
    如何在 C++ 中安全地启动可执行文件:为什么 CreateProcess() 是您的最佳选择?
    利用 CreateProcess() 启动可执行文件在本指南中,我们将探讨如何从另一个 C 可执行文件中打开可执行文件 (.exe)。 使用 system() 的陷阱在深入研究解决方案之前,强调以下危险至关重要:使用 system() 函数。 System() 有几个缺点:它很糟糕,可能会减慢程序速...
    编程 发布于2024-11-09
  • 使用这些运算符增强您的打字稿游戏
    使用这些运算符增强您的打字稿游戏
    空值合并运算符 (??) ?? 运算符用于在处理 null 或未定义时提供默认值。它检查左侧是否为 null 或未定义,如果是,则返回右侧值。 let value = null; let defaultValue = "DefaultValue"; let result = value ?? de...
    编程 发布于2024-11-09
  • 最佳 jsGames 游戏投票开始了!
    最佳 jsGames 游戏投票开始了!
    今年的 js13kGames 竞赛带来了 189 款新的小型受限游戏 - 恭喜每一位成功提交参赛作品的人!现在是时候投票并选出第13届周年纪念版的获胜者。 在线投票将于9月15日至10月4日进行,获奖者将于10月5日公布。如果您参与并提交了参赛作品,您现在可以评判其他人的游戏并为他们提供投票。这意味...
    编程 发布于2024-11-09
  • 如何在 PHP 中按日期对对象数组进行排序?
    如何在 PHP 中按日期对对象数组进行排序?
    按日期对对象数组进行排序在 PHP 中,我们经常遇到需要按特定属性对对象数组进行排序的情况,例如日期字段。这使我们能够按时间顺序显示或操作数据。按日期重新排列对象考虑以下对象数组,其中每个对象代表一条带有日期属性:$array = [ 495 => (object)['date' =&...
    编程 发布于2024-11-09
  • 如何使用 jQuery 检测键盘 Enter 按下:综合指南
    如何使用 jQuery 检测键盘 Enter 按下:综合指南
    使用 jQuery 检测键盘 Enter 按下:综合指南检测用户输入对于构建交互式 Web 应用程序至关重要。一项常见任务是捕获 Enter 按键。本文探讨了如何使用 jQuery 无缝地实现这一点,并解决了有关浏览器兼容性的问题。jQuery 解决方案jQuery 提供了一种名为 keypress...
    编程 发布于2024-11-09
  • 提高 Spring Boot 应用程序的性能 - 第二部分
    提高 Spring Boot 应用程序的性能 - 第二部分
    在本文的第一部分中,我们学习了如何提高应用程序的性能,将 Tomcat 替换为 Undertow,即高性能 Web 服务器,除了启用和配置数据压缩之外,还可以减少通过网络传输的 HTTP 响应的大小。 现在,我们将讨论如何在持久化部分提高Spring Boot应用程序的性能,但首先我们需要了解什么是...
    编程 发布于2024-11-09
  • 如何在 Golang 中实现真正的并行:Goroutines、死锁和通道?
    如何在 Golang 中实现真正的并行:Goroutines、死锁和通道?
    Golang 中的并行处理:利用并发来提高性能考虑提供的代码,其中展示了 Goroutines 的并行处理。然而,它提出了关于并发执行的潜力以及实现并行性的最佳方法的问题。dowork的并发执行dowork并行执行的前提是不保证。虽然 goroutine 提供了轻量级的并发机制,但操作系统调度程序决...
    编程 发布于2024-11-09
  • 在构造函数中分配原型方法是一个好主意吗?
    在构造函数中分配原型方法是一个好主意吗?
    在构造函数中分配原型方法:潜在的缺点和范围问题序言本文深入研究了构造原型方法时的风格偏好困境JavaScript 对象。首选方法是直接在构造函数函数体内分配方法,这与在构造函数外部定义方法的传统方法形成鲜明对比。虽然首选方法可能看起来美观,但问题出现了:这种技术是否存在任何固有的缺点或潜在的范围问题...
    编程 发布于2024-11-09
  • 混淆技术如何保护PHP知识产权?
    混淆技术如何保护PHP知识产权?
    混淆 PHP 代码以保护知识产权作为软件开发人员,保护源代码至关重要,尤其是在计划出售您的作品时。混淆技术为增强 PHP 代码的机密性提供了一个有价值的解决方案。混淆方法混淆涉及将 PHP 代码转换为混乱版本,该版本保留功能但妨碍人类可读性。有几种工具和技术可以实现此目的:1。 PHP 加速器这些工...
    编程 发布于2024-11-09
  • 如何使用 JavaScript 修改外部样式表中定义的 CSS 值?
    如何使用 JavaScript 修改外部样式表中定义的 CSS 值?
    使用 JavaScript 修改 CSS 值JavaScript 提供了一种设置内联 CSS 值的简单方法。然而,当修改非内联样式表中定义的 CSS 值时,此方法可能会带来挑战。从样式表中检索 CSS 值要检索非内联样式表中的 CSS 值非内联,JavaScript 允许通过 document.st...
    编程 发布于2024-11-09
  • 如何在 PHP 中计算日期之间的小时差?
    如何在 PHP 中计算日期之间的小时差?
    确定 PHP 中日期之间的小时差您希望计算两个日期之间的小时差,其格式为 " Y-m-d H:i:s."在 PHP 中实现此目的:将日期转换为时间戳:时间戳表示自 1970 年 1 月 1 日午夜(以您的服务器时区为准)以来的秒数。要将日期转换为时间戳,请使用 strtotime...
    编程 发布于2024-11-09
  • 反应受控/不受控组件
    反应受控/不受控组件
    在 React 中,处理表单输入主要有两种方法: 受控组件 不受控制的组件 受控组件提供更多控制和验证,而不受控组件更简单,对于间歇性值访问的基本形式有用。 受控组件 这些是表单输入,其值由 React State 控制。每当输入的值发生变化时,状态变量就会更新,并且输入的值是通过 ...
    编程 发布于2024-11-09
  • 如何处理 Selenium 中的“过时元素引用”异常?
    如何处理 Selenium 中的“过时元素引用”异常?
    陈旧元素引用:揭示原因并寻找解决方案在 Selenium 中,遇到“陈旧元素引用”异常可能会令人沮丧,因为它表明被引用的元素不再附加到页面文档。当 DOM 发生重大更改(例如动态加载或页面导航)时,通常会发生此错误。要解决此问题,确定触发异常的确切代码行至关重要。在提供的代码中,导致错误的行似乎是:...
    编程 发布于2024-11-09
  • 如何高效地在嵌套的 JavaScript 对象中查找特定对象?
    如何高效地在嵌套的 JavaScript 对象中查找特定对象?
    迭代嵌套的 JavaScript 对象迭代嵌套的 JavaScript 对象可能具有挑战性,特别是当您需要基于属性检索特定对象时价值。让我们考虑以下示例:var cars = { label: 'Autos', subs: [ { label: 'SUVs', ...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3