console.log('template setup', ctx)
}
module.exports = {
// ...
prompts: [
{
name: 'install',
type: 'confirm',
message: 'Install dependencies',
initial: true
},
{
name: 'pm',
type: prev => prev ? 'select' : null,
message: 'Package manager',
hint: ' ',
choices: [
{ title: 'npm', value: 'npm' },
{ title: 'yarn', value: 'yarn' }
]
}
],
setup: async ctx => {
// 根据用户选择决定如何安装依赖
ctx.config.install = ctx.answers.install && ctx.answers.pm
}
}
module.exports = {
// ...
prompts: [
{
name: 'features',
type: 'multiselect',
message: 'Project features',
instructions: false,
choices: [
{ title: 'TypeScript', value: 'typescript', selected: true }
// ....
]
}
],
setup: async ctx => {
// 动态设置模板源文件目录
ctx.config.source = ctx.answers.features.includes('typescript')
? 'template/typescript'
: 'template/javascript'
}
}
Другие настройки, на которые вы можете направить свою творческую энергию...
Template prepare hook, execute after template files prepare, before rename & render.
Шаблонный хук подготовки, выполняется после подготовки файлов шаблона, перед переименованием и рендерингом.
(ctx: Context) => Promise<void>
module.exports = {
prepare: async ctx => {
// В этом контексте вы можете безопасно получить доступ к следующим членам:
const {
template,
project,
options,
dest,
src,
config,
answers,
files // Список файлов, которые ещё не были переименованы и отображены
} = ctx
console.log('template prepare', ctx)
}
}
Пример:
Динамическое добавление необходимых сгенерированных файлов
module.exports = {
prepare: async ctx => {
ctx.files.push({
path: 'additional.txt',
contents: Buffer.from('<%= name %> additional contents')
})
}
}
Template emit hook, execute after all files emit to the destination.
Хук генерации шаблонов, который выполняется после того, как все файлы сгенерированы в целевой каталог.
(ctx: Context) => Promise<void>
module.exports = {
emit: async ctx => {
// Здесь вы можете безопасно получить доступ к следующим участникам:
const {
template,
project,
options,
dest,
src,
config,
answers,
files // список файлов, которые уже были переименованы и визуализированы
} = ctx
console.log('template emit')
}
}
Завершающий обратный вызов, если он установлен как строка, то будет выведен на консоль.
Тип: string
или (ctx: Context) => string | Promise<void | string>
Значение по умолчанию: вывод всего списка сгенерированных файлов.
Ссылка: Context.
Функция обратного вызова:
module.exports = {
complete: async ctx => {
// ctx => all context
console.log(' Happy hacking ;)')
}
}
Или строка:
module.exports = {
complete: ' Happy hacking ;)'
}
Дополнительные примеры можно найти в fixtures.
/**
* Creator context.
*/
interface Context {
/**
* Template name.
* e.g.
* - offlical short name: `nm`
* - offlical short name with branch: `nm#master`
* - custom full name: `zce/nm`
* - custom full name with branch: `zce/nm#master`
* - local directory path: `~/templates/nm`
* - full url: `https://github.com/zce/nm/archive/master.zip`
*/
readonly template: string
/**
* Project name, which is also the project directory.
*/
readonly project: string
/**
* More options.
*/
readonly options: Options & Record<string, any>
/**
* The source directory where the template (absolute).
*/
src: string
/**
* Generated result output destination directory (absolute).
*/
dest: string
/**
* Template config.
*/
readonly config: Template
/**
* Template prompts answers.
*/
readonly answers: Answers<string>
/**
* Template files.
*/
readonly files: File[]
}
/**
* Template config.
*/
export interface Template {
/**
* Template name.
*/
name: string
/**
* Template version.
*/
version?: string
/**
* Template source dirname.
*/
source?: string
/**
* Template metadata.
*/
metadata?: Record<string, unknown>
/**
* Template prompts.
*/
prompts?: PromptObject | PromptObject[]
/**
*
``` ### Шаблонные фильтры
*/
filters?: { [key: string]: (answers: Answers<string>) => boolean }
/**
* Помощники шаблонизатора.
*/
helpers?: { [key: string]: unknown }
/**
* Автоматическая установка зависимостей.
*/
install?: false | 'npm' | 'yarn' | 'pnpm'
/**
* Автоматическое создание репозитория Git.
*/
init?: boolean
/**
* Хук настройки шаблона, выполняется после загрузки шаблона и завершения опроса.
*/
setup?: (ctx: Context) => Promise<void>
/**
* Подготовительный хук шаблона, выполняется после подготовки файлов шаблона, перед переименованием и рендерингом.
*/
prepare?: (ctx: Context) => Promise<void>
/**
* Эмиттерный хук шаблона, выполняется после того, как все файлы будут отправлены в место назначения.
*/
emit?: (ctx: Context) => Promise<void>
/**
* Завершение работы шаблона.
*/
complete?: ((ctx: Context) => string | Promise<string> | Promise<void>) | string
}
### File
```typescript
/**
* Информация о файле.
*/
export interface File {
/**
* Полный путь к файлу
*/
path: string
/**
* Содержимое файла (буфер)
*/
contents: Buffer
}
## Зависимости
Поскольку шаблон автоматически устанавливает производственные зависимости перед работой, вы можете нормально использовать сторонние модули NPM в конфигурационном файле шаблона.
Например:
Установите модуль `chalk` в качестве производственной зависимости:
```shell
$ npm install chalk --save
index.js
:
const chalk = require('chalk')
Примечание: Только производственные зависимости устанавливаются автоматически.
Установите модуль caz
в качестве зависимости разработки:
$ npm install caz --save-dev
Затем в вашем конфигурационном файле шаблона:
/** @type {import('caz').Template} */
module.exports = {
// Имеет интеллектуальные подсказки и типовое восприятие (VSCode)
}
Если вы хотите напрямую вывести символы интерполяции шаблона, вы можете сделать это следующим образом:
<%= '\<%= name %\>' %>
=> <%= name %>
<%= '${name}' %>
=> ${name}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )