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