Skip to content

Важный этап: Переход на Go и Внедрение Task нативно #38

@dealenx

Description

@dealenx

Раньше razd был умной оберткой, которая требовала наличия установленного task (Taskfile) в системе. Это создавало лишний барьер для входа: "скачай razd, а, ой, еще task установи".

Я решил это изменить.

Мы избавляемся от exec.Command("task", ...) и жесткой зависимости от бинарника. Теперь движок Go-Task (v3) импортируется как библиотека прямо в код razd.

Что это дает?
Zero Dependency: Пользователю нужен только один бинарник razd. Всё работает из коробки.
Контроль: Прямой доступ к API раннера (stdout/stderr стриминг, контексты, хуки) вместо парсинга текста из консоли.
Скорость: Нет накладных расходов на спаун новых процессов ОС.

Теперь razd - это не просто CLI-враппер, а самодостаточный инструмент для инициализации и управления проектами, с мощью Taskfile под капотом.

План миграции и технический дизайн уже готовы. Ссылка на PR/Issue внизу 👇

#golang #opensource #devops #razd #taskfile


2. Технический дизайн (RFC / Design Doc)

Этот документ можно прикрепить к Issue на GitHub или положить в документацию для контрибьюторов.


RFC: Native Taskfile Runner Integration

1. Context & Problem

В текущей реализации razd полагается на внешний бинарный файл task, вызывая его через os/exec.
Проблемы:

  • Зависимость среды: У пользователя должен быть установлен task в $PATH.
  • Хрупкость: Парсинг вывода ошибок и статусов выполнения через stdout/stderr ненадежен.
  • Ограниченный контроль: Невозможно гибко управлять контекстом выполнения или перехватывать внутренние события раннера.

2. Solution

Интегрировать пакет github.com/go-task/task/v3 непосредственно в кодовую базу razd. Использовать task.Executor для программного запуска задач вместо spawning subprocesses.

3. Architecture Changes

Current Flow (Legacy)

flowchart LR
    A[Razd CLI] --> B(fork/exec)
    B --> C[Task Binary]
    C --> D[Taskfile.yml]

Loading

Target Flow (Native)

flowchart LR
    A[Razd CLI] --> B[Task Library Embedded]
    B --> C[Taskfile.yml]
Loading

4. Implementation Details

Dependency

Добавление зависимости в go.mod:

go get github.com/go-task/task/v3

Code Reference

Вместо вызова командной строки, мы инициализируем Executor.

import (
    "context"
    "github.com/go-task/task/v3"
    "github.com/go-task/task/v3/args"
)

type NativeRunner struct {
    // конфигурация
}

func (r *NativeRunner) Run(ctx context.Context, taskName string) error {
    e := task.Executor{
        Dir:        r.WorkDir,
        Entrypoint: "Taskfile.yml",
        
        // Прямой проброс потоков для интерактивности
        Stdin:  os.Stdin,
        Stdout: os.Stdout,
        Stderr: os.Stderr,
        
        // Опционально: переопределение цветов или переменных
        Color:  true,
    }

    // Инициализация (парсинг yaml, env vars)
    if err := e.Setup(); err != nil {
        return fmt.Errorf("failed to parse Taskfile: %w", err)
    }

    // Выполнение
    return e.RunTask(ctx, &args.Call{Task: taskName})
}

5. Constraints & Risks

  • Internal Packages: Go-Task скрывает логику парсинга YAML в пакете internal/taskfile. Мы не можем модифицировать структуру Taskfile программно до запуска, только исполнять существующие файлы. Это приемлемо для razd, так как мы генерируем файлы на этапе init.
  • Binary Size: Размер бинарника razd увеличится (~ +2-3MB), так как код Taskfile теперь включен в сборку. Решается через go build -ldflags="-s -w".

6. Benefit

Превращает razd в standalone tool. Пользователь скачивает один бинарник и получает полностью настроенное окружение для работы с проектом.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions