Разработка инструментов узла

JavaScript

1 Обзор

Инструмент для строительных лесов на самом делеnode-cliприложение, создание строительных лесов создаетnode-cliприложение, сначалаmkdirСоздайте каталог инструментов.

mkdir samlpe-cli
cd sample-cli

в этом каталоге черезyarn initинициализироватьpackage.jsonдокумент

yarn init

тогда нужноpackage.jsonдобавлено вbinполе для указанияcliВходной файл для приложения.

{
  "name": "sample-cli",
  "bin": "cli.js",
}

Добавить кcli.jsфайл, файл ввода должен иметь определенный заголовок файла, то есть написать такое предложение вверху файла#! /usr/bin/env node.

#! /usr/bin/env node

console.log('cli working')

Если операционная системаlinuxилиmacНеобходимо изменить права на чтение и запись этого файла, изменить его на755, чтобы его можно было использовать какcliВыполнение файла ввода.

пройти черезyarn linkСопоставьте этот модуль глобально.

yarn link

В это время его можно выполнить в командной строкеsample-cliкоманда, выполнив эту командуconsole.logОн успешно распечатывается, указывая на то, что код выполнен, а это значит, чтоcliОн готов к запуску.

sample-cli

2. Реализуйте простой каркас

Во-первых, вам нужно запросить у пользователя некоторую информацию через взаимодействие с командной строкой, а затем сгенерировать файл на основе результатов, возвращенных пользователем. существуетnodeЧтобы инициировать интерактивный запрос командной строки в , вы можете использоватьinquirerмодуль.

yarn add inquirer --dev

inquirerМодуль предоставляет метод приглашения для инициирования запроса командной строки, который может получить параметр массива.Каждый элемент массива представляет собой вопрос, который может быть передан черезtypeукажите метод ввода вопроса, затемnameключ, определяющий возвращаемое значение,messageЗадает подсказку на экране для пользователя, вpromiseизthenВнутри получите этот вопрос, чтобы получить ответ пользователя.

const inquirer = require('inquirer');

inquirer.prompt([
    {
        type: 'input',
        name: 'name',
        message: 'Project name'
    }
]).then(answer => {
    console.log(answer);
})

который имеетinquirerСледующее, что нужно учитывать, это динамическое создание файла проекта, который обычно создается в соответствии с шаблоном, поэтому создайте новый в каталоге проекта.templatesкаталог и создайте несколько шаблонов в этом каталоге.

index.html

<head>
    <title><%= name %></title>
</head>

style.css

body {
    margin: 0;
    background-color: red;
}

Каталог шаблона должен быть текущим каталогом проекта.templatesпройти черезpathПолучать.

const path = require('path');

// 工具当前目录
const tmplDir = path.join(__dirname, 'templates');

Целевым каталогом вывода обычно является путь, по которому находится командная строка, т.е.cwdсодержание.

const path = require('path');

// 工具当前目录
const tmplDir = path.join(__dirname, 'templates');
// 命令行所在目录
const destDir = process.cwd();

Указав эти два каталога, вы можете передатьfsМодуль считывает, какие файлы находятся в каталоге шаблона. Введите все эти файлы в целевой каталог черезfsизreadDirМетод автоматически сканирует все файлы в каталоге.

fs.readdir(tmplDir, (err, files) => {
    if (err) {
        throw err;
    }
    files.forEach(file => {
        console.log(file); // 得到每个文件的相对路径
    })
})

Файл, соответствующий пути, может быть отображен с помощью механизма шаблонов, такого какejs.

yarn add ejs --dev

Вернитесь к коду и введите механизм шаблонов, предоставленный механизмом шаблонов.renderFileФайл, соответствующий пути рендеринга. Первый параметр — это абсолютный путь к файлу, второй параметр — это контекст данных при работе шаблонизатора, а третий параметр — функция обратного вызова, которая является функцией обратного вызова после успешного рендеринга.Конечно, если он появляется в процессе рендеринга Случайноthrow errКак отбрасываются ошибки.

const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
const ejs = require('ejs');

// 工具当前目录
const tmplDir = path.join(__dirname, 'templates');
// 命令行所在目录
const destDir = process.cwd();

inquirer.prompt([
    {
        type: 'input',
        name: 'name',
        message: 'Project name'
    }
]).then(answer => {
    fs.readdir(tmplDir, (err, files) => {
        if (err) {
            throw err;
        }
        files.forEach(file => {
            ejs.renderFile(path.join(tmplDir, file), answer, (err, result) => {
                if (err) {
                    throw err;
                }
                console.log(result);
            })
        })
    })
})

Запустите инструмент создания лесов.

sample-cli

Результат, напечатанный в это время, на самом деле является результатом, обработанным механизмом шаблонов. Вам нужно только записать результат в целевой каталог, написав файл. Целевой каталог должен бытьpath.joinПучокdestDirтак же какfileСделайте сплайсинг, содержаниеresult.

files.forEach(file => {
    ejs.renderFile(path.join(tmplDir, file), answer, (err, result) => {
        if (err) {
            throw err;
        }
        fs.writeFileSync(path.join(destDir, file), result);
    })
})

После этого найдите новый каталог, используя строительные леса.

sample-cli

После ввода имени проекта вы обнаружите, что он автоматически сгенерирует файлы шаблона в соответствующий каталог.На данный момент было завершено очень простое и очень маленькое приложение для формирования лесов. На самом деле принцип работы строительных лесов не сложен, но значение его очень велико, ведь он значительно повышает эффективность в процессе создания проектов.

3. Опубликовать

Вы можете опубликовать свои инструменты наnpm上,提供给更多的人使用。 выпускатьnpmОчень просто, сначала нужно зарегистрироватьсяnpmУчетная запись, есть два способа зарегистрироваться, один из них - войти в системуnpmОфициальный сайтhttps://www.npmjs.com/, другой - использовать командуnpm adduser.

npm adduser

Вам будет предложено ввести имя пользователя, пароль и адрес электронной почты.После регистрации войдите в системуnpmучетная запись.

npm login

Введите по очереди логин, пароль и почтовый ящик.

Выполнить после успешного входаnpm publishИздать приказ.

npm publish

Если сообщается об ошибке:'You do not have permission to publish "samlpe-cli". Are you logged in as the correct user?', с указанием пакетаsamlpe-cliЭто имя уже существует в менеджере пакетов и используется другими.Если вам нужно изменить имя пакета, вы можете перейти кpackage.jsonсерединаnameИзменить имя в.

{
  "name": "sample-cli1",
  "version": "1.0.0",
  "bin": "cli.js",
  ...
}

выполнить сноваpublishпоявляется команда+sample-cli1@1.0.0Это означает, что релиз прошел успешно.

Если при публикации возникает ошибка:no_perms Private mode enable, only admin can publish this module:Указывает, что в настоящее время он не является исходным изображением, а необходимо переключиться обратно на исходное изображение NPM.

npm config set registry https://registry.npmjs.org/

Если вам нужно обновить инструмент, просто продолжайтеnpm publishВы можете обновить выпуск, но следует отметить, что каждый выпуск должен изменить номер версии.version, одна и та же версия не может быть опубликована дважды. И значение номера версии предпочтительно увеличивается.

{
  "name": "sample-cli1",
  "version": "1.0.1",
  "bin": "cli.js",
  ...
}

Если вы хотите отозвать этот выпуск, вы можете выполнить его только после выпуска пакета.24Опубликованные пакеты разрешено снимать в течение часов, более24Часы нельзя снять.

npm unpublish