Написано 2016.08.06
Эта статья изначально создана, пожалуйста, укажите информацию об авторе: Jrain Lau адрес проекта:GitHub.com/ назвал дождь AU/поколения...
предисловие
В реальном процессе разработки создание структуры проекта с нуля является головной болью, поэтому появились различные инструменты поддержки. Автор использует болееyoeman
,express-generator
а такжеvue-cli
является одним из них. Они богаты функциями, но основной функцией является возможность быстро построить полную структуру проекта.Разработчикам нужно только разрабатывать на основе сгенерированной структуры проекта, что очень просто и эффективно.
Как человек, который умрет, не бросив, после ознакомления с тем, как их использовать, я начал обдумывать их принципы. После тщательного изучения документации и исходного кода я наконец-то понял его основной принцип и на его основе построил проект под названиемSCIONлесов.
Теперь давайте возьмем SCION в качестве примера и создадим наш собственный инструмент для строительных лесов с нуля!
основной принцип
yoeman
Построение проекта должно обеспечитьyoeman-generator
.yoeman-generator
По сути, это шаблон проекта с полной файловой структурой, пользователям необходимо вручную поместить этиgenerator
скачать на локальный, а затемyoeman
Будет в соответствии с этимиgenerator
Автоматически генерируются различные проекты.
vue-cli
Предоставляет довольно много опций и функций настройки, но его суть также отличается от удаленных складов.模版
Тянуть на местную, а не на какую-то "местно сгенерированную" черную технику.
Таким образом, идея также доступна - сначала установите разные проекты шаблонов, а затем строительные леса ссылаются на проект шаблона в соответствии с инструкциями пользователя для создания фактического проекта. Шаблонные проекты могут быть встроены в строительные леса или развернуты в удаленных репозиториях. Для более широкой области применения,SCION
Используется второй метод.
Технический отбор
- node.js: Фундаментальная часть всего инструмента для лесов, новейшая версия рекомендуется.
-
es6: новая версия
node.js
дляes6
Поддержка уже очень высока, используяes6
Это может значительно повысить эффективность разработки и опыт разработки. - commander: Инструмент, разработанный TJ для лучшей организации и обработки ввода командной строки.
- co: Инструмент управления асинхронным процессом, разработанный TJ God, позволяет писать асинхронный код более удобным способом.
-
co-prompt: It's still the work of the great god TJ... The traditional command line can only input all parameters and options on a single line at one time. Using this tool can automatically provide prompt information and receive user input step by step. The experience похож
npm init
Шаг за шагом при вводе параметров процесса.
Общая структура
Международная практика, вы должны сначала понять общую структуру, прежде чем начинать разработку, см. Рисунок:
понять сначала模版
Концепция чего-либо. Шаблон — это шаблон для проекта, который содержит полную структуру и информацию о проекте.
Информация о шаблоне хранится в файле с именемtemplates.json
в файле.
Пользователи могут использовать командную строку дляtemplates.json
Добавление, удаление и перечисление операций.
Выбирая разные шаблоны, SCION автоматически подтянет соответствующие шаблоны с удаленного склада на локальный, чтобы завершить построение проекта.
Окончательная файловая структура всего скаффолдинга выглядит следующим образом:
=================
|__ bin
|__ scion
|__ command
|__ add.js
|__ delete.js
|__ init.js
|__ list.js
|__ node_modules
|__ package.json
|__ templates.json
входной файл
Сначала создайте проект, вpackage.json
Напишите зависимости внутри и выполнитеnpm install
:
"dependencies": {
"chalk": "^1.1.3",
"co": "^4.6.0",
"co-prompt": "^1.0.0",
"commander": "^2.9.0"
}
Создал в корневом каталоге\bin
папку, создайте в ней имя без суффиксаscion
документ. этоbin\scion
Файл - это файл ввода для всей леспе, поэтому давайте сначала напишем.
Сначала некоторый код инициализации:
#!/usr/bin/env node --harmony
'use strict'
// 定义脚手架的文件路径
process.env.NODE_PATH = __dirname + '/../node_modules/'
const program = require('commander')
// 定义当前版本
program
.version(require('../package').version )
// 定义使用方法
program
.usage('<command>')
Как видно из предыдущей схемы архитектуры, скаффолдинг поддерживает ввод пользователем 4 различных команд. Теперь давайте напишем метод для обработки этих 4 команд:
program
.command('add')
.description('Add a new template')
.alias('a')
.action(() => {
require('../command/add')()
})
program
.command('list')
.description('List all the templates')
.alias('l')
.action(() => {
require('../command/list')()
})
program
.command('init')
.description('Generate a new project')
.alias('i')
.action(() => {
require('../command/init')()
})
program
.command('delete')
.description('Delete a template')
.alias('d')
.action(() => {
require('../command/delete')()
})
commander
Конкретный метод использования не будет здесь раскрываться, вы можете перейти непосредственно кОфициальный сайтСм. подробную документацию.
Наконец, не забудьте обработать параметры и предоставить справочную информацию:
program.parse(process.argv)
if(!program.args.length){
program.help()
}
Смотрите полный кодздесь.
использоватьnode
Запустите этот файл и увидите следующий вывод, который доказывает, что файл записи был записан.
Usage: scion <command>
Commands:
add|a Add a new template
list|l List all the templates
init|i Generate a new project
delete|d Delete a template
Options:
-h, --help output usage information
-V, --version output the version number
Обработка пользовательского ввода
Создан в корневом каталоге проекта\command
Папка, специально используемая для хранения файлов обработки команд.
Создал в корневом каталогеtemplates.json
файл и напишите следующее содержимое для хранения информации о шаблоне:
{"tpl":{}}
Добавить шаблон
Войти\command
и новыйadd.js
документ:
'use strict'
const co = require('co')
const prompt = require('co-prompt')
const config = require('../templates')
const chalk = require('chalk')
const fs = require('fs')
module.exports = () => {
co(function *() {
// 分步接收用户输入的参数
let tplName = yield prompt('Template name: ')
let gitUrl = yield prompt('Git https link: ')
let branch = yield prompt('Branch: ')
// 避免重复添加
if (!config.tpl[tplName]) {
config.tpl[tplName] = {}
config.tpl[tplName]['url'] = gitUrl.replace(/[\u0000-\u0019]/g, '') // 过滤unicode字符
config.tpl[tplName]['branch'] = branch
} else {
console.log(chalk.red('Template has already existed!'))
process.exit()
}
// 把模板信息写入templates.json
fs.writeFile(__dirname + '/../templates.json', JSON.stringify(config), 'utf-8', (err) => {
if (err) console.log(err)
console.log(chalk.green('New template added!\n'))
console.log(chalk.grey('The last template list is: \n'))
console.log(config)
console.log('\n')
process.exit()
})
})
}
удалить шаблон
Точно так же в\command
создать папкуdelete.js
документ:
'use strict'
const co = require('co')
const prompt = require('co-prompt')
const config = require('../templates')
const chalk = require('chalk')
const fs = require('fs')
module.exports = () => {
co(function *() {
// 接收用户输入的参数
let tplName = yield prompt('Template name: ')
// 删除对应的模板
if (config.tpl[tplName]) {
config.tpl[tplName] = undefined
} else {
console.log(chalk.red('Template does not exist!'))
process.exit()
}
// 写入template.json
fs.writeFile(__dirname + '/../templates.json', JSON.stringify(config), 'utf-8', (err) => {
if (err) console.log(err)
console.log(chalk.green('Template deleted!'))
console.log(chalk.grey('The last template list is: \n'))
console.log(config)
console.log('\n')
process.exit()
})
})
}
Шаблон списка
Учреждатьlist.js
документ:
'use strict'
const config = require('../templates')
module.exports = () => {
console.log(config.tpl)
process.exit()
}
Построить проект
Теперь к нашей самой важной части - созданию проекта. Точно так же в\command
Создайте новый каталог с именемinit.js
документ:
'use strict'
const exec = require('child_process').exec
const co = require('co')
const prompt = require('co-prompt')
const config = require('../templates')
const chalk = require('chalk')
module.exports = () => {
co(function *() {
// 处理用户输入
let tplName = yield prompt('Template name: ')
let projectName = yield prompt('Project name: ')
let gitUrl
let branch
if (!config.tpl[tplName]) {
console.log(chalk.red('\n × Template does not exit!'))
process.exit()
}
gitUrl = config.tpl[tplName].url
branch = config.tpl[tplName].branch
// git命令,远程拉取项目并自定义项目名
let cmdStr = `git clone ${gitUrl} ${projectName} && cd ${projectName} && git checkout ${branch}`
console.log(chalk.white('\n Start generating...'))
exec(cmdStr, (error, stdout, stderr) => {
if (error) {
console.log(error)
process.exit()
}
console.log(chalk.green('\n √ Generation completed!'))
console.log(`\n cd ${projectName} && npm install \n`)
process.exit()
})
})
}
Как видите, эта часть кода тоже очень проста, ключевым предложением является
let cmdStr = `git clone ${gitUrl} ${projectName} && cd ${projectName} && git checkout ${branch}`
Его роль заключается в клонировании из удаленного репозитория в пользовательский каталог и переключении на соответствующую ветку. Учащиеся, знакомые с командами git, должны понимать, что незнакомым ученикам пора составлять уроки!
глобальное использование
Чтобы быть доступными по всему миру, нам нужноpackage.json
Установите его внутри:
"bin": {
"scion": "bin/scion"
},
При локальной отладке выполняйте ее в корневом каталоге
npm link
т.е.scion
Команда привязана к глобальной и может быть использована напрямую в будущем.scion
как начало команды без ввода длинногоnode scion
такие как команды.
Теперь, когда наш инструмент для строительных лесов настроен, давайте попробуем его!
использовать тест
- добавить команду Добавить шаблон
- init | i Создать команду проекта
- delete | d удалить команду шаблона и список | l команда шаблона списка
Готово! Теперь, когда весь наш инструмент создания шаблонов создан, нам нужно знать только адрес git https и ветку шаблона, чтобы постоянно добавлять его в SCION.Для совместной работы нам нужно только поделиться SCIONtemplates.json
файл в порядке.
постскриптум
Это не выглядит сложным, но нужно много думать, чтобы создать его с нуля. Самая большая проблема в том, что ты не знаешь, как выглядеть.npm init
Таким образом, вы можете шаг за шагом обрабатывать пользовательский ввод и знать только одну командную строку для ввода всех параметров.Такой пользовательский опыт действительно плох. Исследованоvue-cli
а такжеyoeman
Соответствующего кода я не нашел, поэтому пришлось гуглить, и наконец нашел статью, которую можно использовать сco
а такжеco-prompt
Реализация этих двух инструментов, еще раз поклоняюсь всемогущему Богу TJ и надеюсь, что маленький партнер может сказать мнеvue-cli
Как они достигаются.
Эти леса имеют только самые основные функции, и они далеки от высоты аналогичных продуктов на рынке.Я буду наполнять их в будущем.В любом случае, я действительно многому научился в процессе завершения SCION.
Спасибо за прочтение. Я Джрейн, добро пожаловать в подпискумоя колонка, поделятся своим опытом обучения, опытом разработки и время от времени выносят галантерейные товары за стену. Увидимся в следующий раз!