ホームページ  >  記事  >  ウェブフロントエンド  >  degit を使用して、CLI ツールでテンプレートをダウンロードします。

degit を使用して、CLI ツールでテンプレートをダウンロードします。

王林
王林オリジナル
2024-08-17 06:51:32644ブラウズ

Remotion ソース コードで「degit」という名前のファイルを見つけました。
リモートを使用すると、プログラムでビデオを作成できます。

この記事では、次の概念について説明します:

  1. デジットとは何ですか?
  2. Remotion のデジット ファイルからインスピレーションを得たシンプルなデジット関数を構築する

デジットとは何ですか?

オープンソースの Readme の 1 つで「デジット」について言及されていたのを覚えていますが、それがどのリポジトリだったか思い出せなかったので、デジットの意味をグーグルで検索し、このデジット npm パッケージを見つけました。

簡単に言えば、degit を使用すると、最新のコミットをダウンロードするだけで Github リポジトリのコピーをすばやく作成できます
git 履歴全体の代わりに。

このパッケージの詳細については、degit の公式 npm パッケージにアクセスしてください。

このデジット パッケージを使用すると、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 のデジット ファイルからインスピレーションを得たシンプルなデジット関数を構築する

単純なデジット関数の構築方法を理解するために、Remotion の degit.ts ファイルのコードを分解してみましょう。このファイルは、完全な履歴をダウンロードせずに GitHub リポジトリの最新状態を取得するという、degit npm パッケージの機能の基本バージョンを実装します。

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<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);
    });
}
  • URL 処理: この関数は、リクエストが成功したかどうかを確認します (ステータス コードが 300 未満)。 リダイレクト (コード 300 ~ 399) の場合は、新しい URL に従います。 エラー (コード 400 以上) の場合、Promise は拒否されます。
  • ファイルの保存: リポジトリは、fs.createWriteStream を使用してダウンロードされ、宛先パスに保存されます。

3: リポジトリの抽出

リポジトリをダウンロードした後、tarball の内容を抽出する必要があります。

function untar(file: string, dest: string) {
    return tar.extract(
        {
            file,
            strip: 1,
            C: dest,
        },
        [],
    );
}
  • Tar 抽出: この関数は、.tar.gz ファイルの内容を指定された宛先ディレクトリに抽出します。

4: すべてをまとめる

メインのデジット関数はすべてを結び付け、ディレクトリの作成、フェッチ、リポジトリの抽出を処理します。

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 は、インストール コマンドを実行するときにテンプレートをダウンロードするためにデジットを使用していることがわかりました。

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

メール: ramu.narasinga@gmail.com

オープンソースで使用されているベスト プラクティスを学びます。

参考文献:

  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

以上がdegit を使用して、CLI ツールでテンプレートをダウンロードします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。