Start Debugging

Aspire 13.5 добавляет полноценный терминал прямо в дашборд

WithTerminal() даёт ресурсу интерактивную PTY-сессию, в которую можно печатать из дашборда или подключиться из собственной оболочки. Она экспериментальная, отцепляет отладчик, а опции Shell, под которую вы могли писать код, больше нет.

Aspire 13.5 вышел 18 августа 2026 года: переработанный дашборд, TypeScript-AppHost в статусе GA и дюжина ломающих изменений. Но по-настоящему меняет цикл разработки вещь помельче — WithTerminal(), которая даёт ресурсу живой псевдотерминал: в него можно печатать из дашборда, а не только читать лог консоли.

Один вызов — и у ресурса появляется PTY

#pragma warning disable ASPIRETERMINAL001
var agent = builder.AddExecutable("agent", "my-agent", ".")
    .WithTerminal();
#pragma warning restore ASPIRETERMINAL001

API экспериментальный, поэтому вызов выдаёт ASPIRETERMINAL001, и AppHost не соберётся, пока вы это не подтвердите — прагмой выше или добавив идентификатор в <NoWarn>. После включения на странице Console Logs ресурса в дашборде появляется вид терминала рядом с обычным потоком логов, и запущенные ресурсы открываются в нём по умолчанию.

Перегрузка с опциями отвечает за геометрию сетки:

.WithTerminal(options =>
{
    options.Columns = 200;  // по умолчанию 120
    options.Rows = 50;      // по умолчанию 30
});

Оба значения должны быть не меньше 1; ноль или отрицательное бросает ArgumentOutOfRangeException. Третья опция, ShowTerminalHost (по умолчанию false), удачно выдаёт внутреннее устройство: она определяет, “показывать ли скрытые ресурсы-хосты терминала, по одному на реплику, в дашборде и в списках ресурсов CLI”. У каждой реплики своя независимая сессия за собственным скрытым ресурсом-хостом, так что .WithReplicas(3).WithTerminal() даёт три, и между ними можно переключаться в дашборде. Порядок этих двух вызовов значения не имеет. Второй вызов WithTerminal() на том же ресурсе бросает исключение.

Подключение из собственной оболочки

CLI-часть спрятана за флагом функциональности:

aspire config set features.terminalCommandsEnabled true
aspire terminal ps
aspire terminal attach agent --replica 1

Сессии поддерживают несколько одновременных зрителей, так что вкладка браузера и локальная оболочка могут управлять одним процессом, и ни одна из них не оборвёт сессию.

Два острых угла

Первый — отладчик. По документации, “когда вы применяете WithTerminal, Aspire запускает ресурс как обычный процесс и не подключает отладчик автоматически”. Значит, это неподходящий инструмент для проекта, который вы сейчас проходите по шагам, и подходящий для TUI, REPL или скрипта миграции, который хочется вести руками. Aspire называет это временным ограничением.

Второй бьёт по тем, кто пробовал это в превью 13.4: выбрать запускаемую оболочку нельзя. Опция Shell исчезла — её убрали, “потому что она никогда не была связана с нижележащим псевдотерминалом и не имела никакого эффекта”. Код, присваивавший TerminalOptions.Shell, перестаёт компилироваться на 13.5, ничего не сделав на 13.4.

И замечание об обновлении, прежде чем всё это пробовать: в примечаниях к выпуску сказано, что смешивание пакетов 13.4 и 13.5 падает в рантайме с MissingMethodException или TypeLoadException. Переводите SDK и все пакеты Aspire.Hosting.* на совпадающие версии одним коммитом. Если вы держите несколько AppHost рядом, это хорошо сочетается с флагом --isolated из 13.2: каждый изолированный запуск получает собственные терминальные сессии вдобавок к собственным портам.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад