«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Используйте degit, чтобы загрузить шаблон в инструмент CLI.

Используйте degit, чтобы загрузить шаблон в инструмент CLI.

Опубликовано 2 ноября 2024 г.
Просматривать:541

Я нашел файл с именем «цифра» в исходном коде Remotion.
Remotion помогает создавать видео программно.

В этой статье мы рассмотрим следующие концепции:

  1. Что такое цифра?
  2. Создайте простую функцию цифр, вдохновленную файлом цифр Remotion.

Что такое цифра?

Я помню, что видел упоминание «цифры» в одном из файлов Readme с открытым исходным кодом, но я не мог вспомнить, какой это репозиторий, поэтому я погуглил, что означает цифра, и нашел этот пакет degit npm.

Проще говоря, вы можете использовать degit, чтобы быстро создать копию репозитория Github, загрузив только последний коммит
вместо всей истории git.

Посетите официальный пакет npm для degit, чтобы узнать больше об этом пакете.

Вы также можете использовать этот пакет 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.ts Remotion. Этот файл реализует базовую версию того, что делает пакет 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: предоставляет путь к временному каталогу системы.
  • путь: обрабатывает и преобразует пути к файлам.
  • tar: извлекает содержимое архива (сжатого файла).
  • 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: Извлечение репозитория

После загрузки репозитория необходимо извлечь содержимое тарбола:

function untar(file: string, dest: string) {
    return tar.extract(
        {
            file,
            strip: 1,
            C: dest,
        },
        [],
    );
}
  • Извлечение Tar: эта функция извлекает содержимое файла .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 использует цифры для загрузки шаблонов при запуске команды их установки:

npx create-video@latest

Эта команда просит вас выбрать шаблон, здесь вступает в действие цифра для загрузки
последний коммит выбранного шаблона

Вы можете проверить этот код в пакете 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 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3