Всех приветствую!
Я решил попробовать себя на новом амплуа писателя и писать о том, что мне интересно и чем я занимаюсь. Я постараюсь делать меньше воды и не слишком длинные посты, так как длинные посты читаются тяжело.
Вступительная вода закончилась, теперь к делу.
yask - что это такое и для чего нужно.
Я пишу на Go (Golang) и как-то была нужда часто создавать проекты и каждый раз создавать папки и файлы по одной и той же структуре очень надоело. Нагуглил только проекты с уже готовой архитектурой и фраемвёрками, но это мне не подошло, так как бывают мелкие отличия и все равно нужно было менять структуру проекта под себя. Еще находил проекты, которые позволяли генерировать проект по yaml или toml файлу, но для меня они оказались не удобными, поэтому было решено изобрести свой "велосипед". Я решил создать утилиту (тоже на Go) для генерации проекта и назвал её yask
yask (yaml skeleton) - утилита для генерации проекта по yaml файлу. Я пытался создать утилиту по типу OpenAPI, чтобы было легче генерировать проект хотя бы для тех, кто уже работал с OpenAPI.
Минимальное содержание конфига и это обязательное поле: skel
. И уже внутри описывается структура проекта.
Есть несколько аргументов и флагов для утилиты.
Аргументы:
help
version
Флаги:
-c
,--config file.yaml
— путь до конфиг файла(обязательный)-h
,--help
— показывает подсказки-p
,--placeholder key=value
— изменяемые параметры, которые подставляются в файл конфигурации.
Что может моя утилита на данном этапе развития.
1. Создание файлов.
Первый и самый простой способ
skel:
README.md: 'Hello YASK!'
Можно создать пустой файл просто оставив README.md: ''
.
Можно также создать несколько файлов с помощью команды files
:
skel:
files:
- README2.md: 'Many files'
- Makefile
- LICENSE
Как видно можно сразу создавать файлы с каким-то содержимым или без него.
Есть еще есть вариантов добавления контента в файлы: через ссылки на другие файлы или отдельную секцию content
.
skel:
readme1.md: '@./README.md'
readme2.md: '@../file.md' # wrong
readme3.md: '#/content/readme'
content:
readme: |
Здесь можно написать любой текст
и даже в несколько строк
@ позволяет указать ссылку на файл и даже можно сделать ссылку на файл, который лежит внутри какой-то дочерней папки, но пока не может ходить в родительскую папку (задача на будущее) и в таком случае файл будет создан, но он будет пустым.
# позволяет доставать данные из content
по сслыке на данные, что позволяет не дублировать данные в конфиге.
2. Создание папок.
Папки можно создавать двумя способами. Первый способ указать имя папки и файлы в этой папке:
skel:
folder:
file: ''
file2: ''
Но если нужно создать пустую папку, то надо использовать команду dirs
:
skel:
folder:
dirs:
- folder1
- folder2
- folder3
Пока нельзя создавать файлы в папках в таком режиме. Нужно отдельно указывать имя директории и какой файл там создать.
Еще бывает нужда создания множества вложенных папок в друг друга и тогда можно сделать следующее:
skel:
dirs:
- folder/folder1/folder2/folder3
folder1/folder2/folder3:
file: 'some text'
3. Выполнение команд.
Иногда легче всего вызвать команду, чтобы она сама сгенерировала часть проекта или скачала некоторые данные. Это делается через команду exec
:
skel:
frontend:
exec:
- "npm create vite@latest ."
- "npm install"
Команды выполняются последовательно в таком случае, но если будет вот так:
skel:
frontend1:
exec:
- "npm create vite@latest ."
- "npm install"
frontend2:
exec:
- "npm create vite@latest ."
- "npm install"
команды выполнятся параллельно.
4. Плейсхолдеры
Иногда проекты бывают одинаковые по структуре и отличаются только названиями и кодом, и в этом случае нам помогут плейсхолдеры, чтобы задать уникальные названия для директорий и не менять конфиг постоянно. В конфиге плейсхолдеры устанавливаются через ${...}
и это выглядит следующим образом:
skel:
dynamic:
${folder}:
README.md: 'dynamic'
files:
- ${file1}.txt: ''
- ${file2}
- README.md: ${readme}
Как видно здесть есть несколько плейсхолдеров:
${folder}
, ${file1}
и ${file2}
, и ${readme}
. Как видно их можно использовать и для директорий и для файлов и для содержимого файлов. Но как передать данные в конфиг? Для это используется флаг -p
или --placeholder
и передаются ключ и значение key=value
. Для конфига выше у нас будет следующая команда:
yask -c config.yaml -p folder=my_project -p file1=file1.txt -p file2=file2.txt -p readme='My Project'
Как вы заметили, то у данной утилиты есть несколько команд (ключевых слов dirs
, files
, exec
, ...) и если нужно создать файл или директорию с таким названием, но перед названием добавляем ^
.
Заключение
На этом пожалуй всё, надеюсь ни чего не упустил)
Буду рад замечаниям, пожаланиям и чего вам не хватает в данной тулзе, чтобы начать ей пользоваться.
Также можете посмотреть код вот здесь yask и по желанию поставить ⭐.