День 2315. #ЧтоНовенького
Представляем dotnet run app.cs. Начало
В .NET 10 превью 4 упрощено начало работы с C#. Теперь вы можете запустить файл C# напрямую с помощью
До сих пор для выполнения кода C# с помощью dotnet CLI требовалась структура проекта, включающая файл .csproj. Теперь с помощью «файловых приложений» (file-based apps), вы можете запустить автономный файл .cs напрямую, как и в случае с такими языками сценариев, как Python или JavaScript.
Это снижает порог входа для изучения C# и делает язык гораздо более привлекательным выбором для сценариев обучения, прототипирования или автоматизации:
- Быстрый старт, не требуется файл проекта — отлично подходит для обучения, экспериментов и небольших скриптов.
- Первоклассная интеграция CLI — никаких дополнительных инструментов, никаких зависимостей, только dotnet и файл .cs.
- Масштабируется до реальных приложений — это не отдельный диалект или среда выполнения. Когда скрипт вырастет, он может превратиться в полноценный проект, использующий тот же язык, синтаксис и инструменты.
Новые директивы уровня файла для файловых приложений C#
Файловые приложения также поддерживают набор мощных директив уровня файла, которые позволяют объявлять небольшое количество важных вещей, хранящихся в файлах проекта для стандартных приложений. Эти директивы делают файловые приложения более гибкими и выразительными, сохраняя совместимость с концепциями MSBuild.
Ссылаемся на NuGet-пакеты
Вы можете добавить ссылку на NuGet-пакет напрямую в файле .cs, используя директиву #:package:
Указываем SDK
По умолчанию файловые приложения используют Microsoft.NET.Sdk SDK. Если вы создаете что-то вроде веб-API, вы можете изменить SDK с помощью директивы #:sdk:
Это сообщает инструментам, что файл следует обрабатывать так, как если бы он был частью веб-проекта, что позволяет использовать такие функции ASP.NET Core, как Minimal API и MVC.
Настраиваем MSBuild
Вы можете настроить дополнительные свойства сборки с помощью #:property:
Это позволяет файловому приложению использовать расширенные языковые функции и таргетинг на платформу без необходимости в полном файле проекта.
Использование строк шебанг для шелл-скриптов
Файловые приложения также поддерживают строки шебанг (#!), что позволяет писать кроссплатформенные шелл-скрипты на C#, которые можно выполнять непосредственно в Unix-подобных системах:
Вы можете сделать файл выполняемым и выполнить его напрямую:
Это позволяет сделать C# удобной опцией для утилит CLI, скриптов автоматизации и тулинга, никакой настройки проекта не требуется.
Окончание следует…
Источник: https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/
Представляем dotnet run app.cs. Начало
В .NET 10 превью 4 упрощено начало работы с C#. Теперь вы можете запустить файл C# напрямую с помощью
dotnet run app.cs. Т.е. больше не нужно создавать файл проекта или создавать каркас целого приложения для запуска быстрого скрипта, тестирования фрагмента кода или простого эксперимента.До сих пор для выполнения кода C# с помощью dotnet CLI требовалась структура проекта, включающая файл .csproj. Теперь с помощью «файловых приложений» (file-based apps), вы можете запустить автономный файл .cs напрямую, как и в случае с такими языками сценариев, как Python или JavaScript.
Это снижает порог входа для изучения C# и делает язык гораздо более привлекательным выбором для сценариев обучения, прототипирования или автоматизации:
- Быстрый старт, не требуется файл проекта — отлично подходит для обучения, экспериментов и небольших скриптов.
- Первоклассная интеграция CLI — никаких дополнительных инструментов, никаких зависимостей, только dotnet и файл .cs.
- Масштабируется до реальных приложений — это не отдельный диалект или среда выполнения. Когда скрипт вырастет, он может превратиться в полноценный проект, использующий тот же язык, синтаксис и инструменты.
Новые директивы уровня файла для файловых приложений C#
Файловые приложения также поддерживают набор мощных директив уровня файла, которые позволяют объявлять небольшое количество важных вещей, хранящихся в файлах проекта для стандартных приложений. Эти директивы делают файловые приложения более гибкими и выразительными, сохраняя совместимость с концепциями MSBuild.
Ссылаемся на NuGet-пакеты
Вы можете добавить ссылку на NuGet-пакет напрямую в файле .cs, используя директиву #:package:
#:package Humanizer@2.14.1
using System.Globalization;
using Humanizer;
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-ru");
var net9Release = DateTimeOffset.Parse("2024-12-03");
var since = DateTimeOffset.Now - net9Release;
Console.WriteLine($"Прошло {since.Humanize()} с релиза .NET 9.");
// Прошло 25 недель с релиза .NET 9.
Указываем SDK
По умолчанию файловые приложения используют Microsoft.NET.Sdk SDK. Если вы создаете что-то вроде веб-API, вы можете изменить SDK с помощью директивы #:sdk:
#:sdk Microsoft.NET.Sdk.Web
Это сообщает инструментам, что файл следует обрабатывать так, как если бы он был частью веб-проекта, что позволяет использовать такие функции ASP.NET Core, как Minimal API и MVC.
Настраиваем MSBuild
Вы можете настроить дополнительные свойства сборки с помощью #:property:
#:property LangVersion preview
Это позволяет файловому приложению использовать расширенные языковые функции и таргетинг на платформу без необходимости в полном файле проекта.
Использование строк шебанг для шелл-скриптов
Файловые приложения также поддерживают строки шебанг (#!), что позволяет писать кроссплатформенные шелл-скрипты на C#, которые можно выполнять непосредственно в Unix-подобных системах:
#!/usr/bin/dotnet run
Console.WriteLine("Привет из скрипта C#!");
Вы можете сделать файл выполняемым и выполнить его напрямую:
chmod +x app.cs
./app.cs
Это позволяет сделать C# удобной опцией для утилит CLI, скриптов автоматизации и тулинга, никакой настройки проекта не требуется.
Окончание следует…
Источник: https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/
👍29
День 2316. #ЧтоНовенького
Представляем dotnet run app.cs. Окончание
Начало
Преобразование в приложение на основе проекта
Когда ваше файловое приложение становится сложнее или вам просто нужны дополнительные возможности, предоставляемые полноценными приложениями на основе проектов, вы можете преобразовать его в стандартный проект с помощью:
Эта команда создаст новый каталог с именем файла, файл .csproj и преобразует все директивы #: в свойства и ссылки MSBuild. Например, из этого файла:
Будет создан такой файл .csproj:
Это делает переход плавным, от одного файла к полностью функциональному, собираемому и расширяемому проекту.
Существующие способы запуска C# без проектов
Это далеко не первый случай, когда разработчики хотят запустить C# без проекта. Такие проекты сообщества, как CS-Script, dotnet-script, Cake и другие, уже давно выполняют эту роль, обеспечивая рабочие процессы сценариев, возможности REPL и другие возможности C#.
Эти инструменты остаются ценными и заслуживают внимания, особенно для более сложных сценариев. Однако новая встроенная поддержка позволяет начать работу немедленно: не требуется дополнительных шагов по установке и настройке.
Что дальше?
Эта новая функция делает C# более доступным, сохраняя при этом всю мощь и глубину экосистемы .NET. Независимо от того, изучаете вы язык, обучаете ему других, создаёте прототипы или производственные системы, эта функция поможет вам быстрее перейти от идеи к реализации.
В предстоящих предварительных версиях .NET 10 обещают улучшить опыт работы с файловыми приложениями в VS Code с улучшенным IntelliSense для новых файловых директив, улучшенной производительностью и поддержкой отладки. Для командной строки идёт работа над обеспечением поддержки файловых приложений с несколькими файлами и способами ускорения запуска.
Создатели призывают вас попробовать новую функцию и ждут ваших отзывов на GitHub.
Источник: https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/
Представляем dotnet run app.cs. Окончание
Начало
Преобразование в приложение на основе проекта
Когда ваше файловое приложение становится сложнее или вам просто нужны дополнительные возможности, предоставляемые полноценными приложениями на основе проектов, вы можете преобразовать его в стандартный проект с помощью:
dotnet project convert app.cs
Эта команда создаст новый каталог с именем файла, файл .csproj и преобразует все директивы #: в свойства и ссылки MSBuild. Например, из этого файла:
#:sdk Microsoft.NET.Sdk.Web
#:package Microsoft.AspNetCore.OpenApi@10.*-*
var builder = WebApplication.CreateBuilder();
builder.Services.AddOpenApi();
var app = builder.Build();
app.MapGet("/", () => "Hello, world!");
app.Run();
Будет создан такой файл .csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.*-*" />
</ItemGroup>
</Project>
Это делает переход плавным, от одного файла к полностью функциональному, собираемому и расширяемому проекту.
Существующие способы запуска C# без проектов
Это далеко не первый случай, когда разработчики хотят запустить C# без проекта. Такие проекты сообщества, как CS-Script, dotnet-script, Cake и другие, уже давно выполняют эту роль, обеспечивая рабочие процессы сценариев, возможности REPL и другие возможности C#.
Эти инструменты остаются ценными и заслуживают внимания, особенно для более сложных сценариев. Однако новая встроенная поддержка позволяет начать работу немедленно: не требуется дополнительных шагов по установке и настройке.
Что дальше?
Эта новая функция делает C# более доступным, сохраняя при этом всю мощь и глубину экосистемы .NET. Независимо от того, изучаете вы язык, обучаете ему других, создаёте прототипы или производственные системы, эта функция поможет вам быстрее перейти от идеи к реализации.
В предстоящих предварительных версиях .NET 10 обещают улучшить опыт работы с файловыми приложениями в VS Code с улучшенным IntelliSense для новых файловых директив, улучшенной производительностью и поддержкой отладки. Для командной строки идёт работа над обеспечением поддержки файловых приложений с несколькими файлами и способами ускорения запуска.
Создатели призывают вас попробовать новую функцию и ждут ваших отзывов на GitHub.
Источник: https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/
👍7
День 2322. #ЧтоНовенького
Запись Логов по Требованию с Буферизацией. Начало
Обычно нужны подробные логи, когда что-то идёт не так, но когда всё хорошо, зачем платить за хранение логов, которые никогда не проверяются. Хотя выборка логов (log sampling) помогает сократить их объём, сохраняя только часть, иногда нужен другой подход.
Буферизация логов в .NET 9 временно сохраняет логи в памяти и позволяет позже решить, записывать ли их. Буферизация даёт контекстный контроль над тем, какие логи сохраняются на основе фактических результатов выполнения.
Концепция
Буферизация логов представляет новый шаблон потока:
1. Код генерирует логи обычным образом,
2. Нужные логи сохраняются в памяти, а не пишутся немедленно,
3. Позже, на основе определённых условий, вы решаете:
- Очистить буфер и записать все захваченные логи,
- Дать времени жизни буфера истечь, фактически отбрасывая ненужные логи.
Так, например, вы можете буферизировать подробные логи для транзакции, сохраняя их только в случае сбоя транзакции и отбрасывая в случае её успеха.
Две стратегии буферизации
.NET 9 предоставляет две стратегии буферизации: глобальная и по запросу.
1. Глобальная буферизация
Хранит логи в кольцевых буферах, общих для всего приложения. Это подходит для буферизации логов, связанных с длительными процессами или фоновыми задачами. Для базовых сценариев включите буферизацию:
Эта конфигурация буферизует все логи от уровня Information. Для более сложных сценариев определите конкретные правила:
- MaxBufferSizeInBytes – максимальный размер буфера.
- MaxLogRecordSizeInBytes – максимальный размер отдельных записей лога.
- AutoFlushDuration – как долго буферизация лога будет оставаться отключенной после запуска операции записи (flush). В примере выше буферизация будет оставаться отключенной в течение 30 секунд, что позволит приложению нормально писать все логи.
Запись глобального буфера
Чтобы записать буферизованные логи, внедрите класс GlobalLogBuffer и вызовите его метод Flush():
В этом примере подробные логи о процессе оплаты сохраняются только в случае возникновения исключения.
Окончание следует…
Источник: https://devblogs.microsoft.com/dotnet/emit-logs-on-demand-with-log-buffering/
Запись Логов по Требованию с Буферизацией. Начало
Обычно нужны подробные логи, когда что-то идёт не так, но когда всё хорошо, зачем платить за хранение логов, которые никогда не проверяются. Хотя выборка логов (log sampling) помогает сократить их объём, сохраняя только часть, иногда нужен другой подход.
Буферизация логов в .NET 9 временно сохраняет логи в памяти и позволяет позже решить, записывать ли их. Буферизация даёт контекстный контроль над тем, какие логи сохраняются на основе фактических результатов выполнения.
Концепция
Буферизация логов представляет новый шаблон потока:
1. Код генерирует логи обычным образом,
2. Нужные логи сохраняются в памяти, а не пишутся немедленно,
3. Позже, на основе определённых условий, вы решаете:
- Очистить буфер и записать все захваченные логи,
- Дать времени жизни буфера истечь, фактически отбрасывая ненужные логи.
Так, например, вы можете буферизировать подробные логи для транзакции, сохраняя их только в случае сбоя транзакции и отбрасывая в случае её успеха.
Две стратегии буферизации
.NET 9 предоставляет две стратегии буферизации: глобальная и по запросу.
1. Глобальная буферизация
Хранит логи в кольцевых буферах, общих для всего приложения. Это подходит для буферизации логов, связанных с длительными процессами или фоновыми задачами. Для базовых сценариев включите буферизацию:
builder.Logging
.AddGlobalLogBuffer(LogLevel.Information);
Эта конфигурация буферизует все логи от уровня Information. Для более сложных сценариев определите конкретные правила:
builder.Logging.AddGlobalBuffer(o =>
{
// Буферизация логов уровня Information, категории "PaymentService"
o.Rules.Add(
new LogBufferingFilterRule(
categoryName: "PaymentService",
logLevel: LogLevel.Information));
o.MaxBufferSizeInBytes = 100 * 1024 * 1024;
o.MaxLogRecordSizeInBytes = 50 * 1024;
o.AutoFlushDuration = TimeSpan.FromSeconds(30);
});
- MaxBufferSizeInBytes – максимальный размер буфера.
- MaxLogRecordSizeInBytes – максимальный размер отдельных записей лога.
- AutoFlushDuration – как долго буферизация лога будет оставаться отключенной после запуска операции записи (flush). В примере выше буферизация будет оставаться отключенной в течение 30 секунд, что позволит приложению нормально писать все логи.
Запись глобального буфера
Чтобы записать буферизованные логи, внедрите класс GlobalLogBuffer и вызовите его метод Flush():
public class PaymentService
{
private ILogger<PaymentService> _logger;
private GlobalLogBuffer _buffer;
public PaymentService(
ILogger<PaymentService> logger,
GlobalLogBuffer buffer)
{
_logger = logger;
_buffer = buffer;
}
public async Task ProcessPayment(
PaymentRequest req)
{
try
{
_logger.LogInformation(
"Старт обработки платежа для транзакции {TransId}", req.TransactionId);
// Обработка платежа...
_logger.LogInformation("Платёж обработан");
}
catch (Exception ex)
{
_logger.LogError(ex, "Сбой обработки");
// Записываем буфер для записи детальных логов
_buffer.Flush();
throw;
}
}
}
В этом примере подробные логи о процессе оплаты сохраняются только в случае возникновения исключения.
Окончание следует…
Источник: https://devblogs.microsoft.com/dotnet/emit-logs-on-demand-with-log-buffering/
👍18
День 2323. #ЧтоНовенького
Запись Логов по Требованию с Буферизацией. Окончание
Начало
2. Буферизация по запросу
Для веб-приложений ASP.NET Core буферизация по запросу обеспечивает более детальный контроль, поддерживая отдельные буферы для каждого HTTP-запроса. Подходит для отслеживания полного контекста отдельных взаимодействий пользователей.
Добавляем буферизацию по запросу:
Ключевое отличие от глобальной буферизации - когда HTTP-запрос завершается, буфер очищается и все его логи удаляются.
Очистка буфера по запросу
Чтобы выдать буферизованные логи для определённого запроса, внедрите класс PerRequestLogBuffer:
Запись (flush) буфера по запросу также записывает глобальный буфер, гарантируя, что все соответствующие логи будут записаны при возникновении ошибки.
Динамические обновления конфигурации
Если вы используете провайдер конфигурации, поддерживающий перезагрузки (например, File Configuration Provider), вы можете обновить правила буферизации без перезапуска приложения.
Это особенно ценно в производственных сценариях, где может потребоваться временно увеличить детализацию логов для диагностики проблемы, а затем вернуться к обычным уровням после её устранения.
Рекомендации
1. Стратегия буферизации
Буферизуйте подробные логи с уровня Information, но позвольте логам Error и Critical записываться немедленно. Это гарантирует, что важные проблемы всегда будут видны, а подробный контекст будет доступен только при необходимости.
2. Создайте явные триггеры записи (flush)
Определите конкретные условия, при которых контекст лога имеет значение, и добавьте явные вызовы записи:
- При исключениях или ошибках,
- Когда операции превышают ожидаемую продолжительность,
- Когда обнаружено что-то подозрительное.
3. Добавьте выборку логов для максимальной эффективности
Для приложений с большим объёмом логов используйте буферизацию и выборку:
- Фильтруйте обычные логи для уменьшения общего объёма,
- Буферизируйте подробные логи для записи контекста очистки при необходимости.
Ограничения
-.NET 9 и выше,
- Точный порядок логов может не сохраняться (временные метки сохраняются),
- Области (scope) логов не поддерживаются,
- Некоторые расширенные свойства записи логов (например, ActivitySpanId) не сохраняются.
Производительность
Буферизация логов — это компромисс между памятью и хранилищем:
- Буферизованные логи потребляют память, пока они не будут либо записаны, либо отброшены,
- Записывая логи только в определённых сценариях, вы можете радикально сократить расходы на хранение.
Для больших распределённых приложений накладные расходы памяти минимальны по сравнению с потенциальной экономией хранилища.
Источник: https://devblogs.microsoft.com/dotnet/emit-logs-on-demand-with-log-buffering/
Запись Логов по Требованию с Буферизацией. Окончание
Начало
2. Буферизация по запросу
Для веб-приложений ASP.NET Core буферизация по запросу обеспечивает более детальный контроль, поддерживая отдельные буферы для каждого HTTP-запроса. Подходит для отслеживания полного контекста отдельных взаимодействий пользователей.
Добавляем буферизацию по запросу:
builder.Services.AddPerIncomingRequestBuffer(o =>
{
// Логи Information от API контроллеров
o.Rules.Add(
new LogBufferingFilterRule(
categoryPrefix: "MyApp.Controllers",
logLevel: LogLevel.Information));
o.AutoFlushDuration = TimeSpan.FromSeconds(5);
});
Ключевое отличие от глобальной буферизации - когда HTTP-запрос завершается, буфер очищается и все его логи удаляются.
Очистка буфера по запросу
Чтобы выдать буферизованные логи для определённого запроса, внедрите класс PerRequestLogBuffer:
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
private ILogger<OrderController> _logger;
private PerRequestLogBuffer _buffer;
public OrderController(
ILogger<OrderController> logger,
PerRequestLogBuffer buffer)
{
_logger = logger;
_buffer = buffer;
}
[HttpPost]
public IActionResult CreateOrder(
OrderRequest request)
{
try
{
_logger.LogInformation("Заказ для клиента {CustomerId}", request.CustomerId);
// Обработка заказа…
_logger.LogInformation("Заказ {OrderId} создан", orderId);
return Ok(new { OrderId = orderId });
}
catch (Exception ex)
{
_logger.LogError(ex, "Сбой заказа");
_buffer.Flush();
return StatusCode(500, "Сбой создания заказа");
}
}
}
Запись (flush) буфера по запросу также записывает глобальный буфер, гарантируя, что все соответствующие логи будут записаны при возникновении ошибки.
Динамические обновления конфигурации
Если вы используете провайдер конфигурации, поддерживающий перезагрузки (например, File Configuration Provider), вы можете обновить правила буферизации без перезапуска приложения.
Это особенно ценно в производственных сценариях, где может потребоваться временно увеличить детализацию логов для диагностики проблемы, а затем вернуться к обычным уровням после её устранения.
Рекомендации
1. Стратегия буферизации
Буферизуйте подробные логи с уровня Information, но позвольте логам Error и Critical записываться немедленно. Это гарантирует, что важные проблемы всегда будут видны, а подробный контекст будет доступен только при необходимости.
2. Создайте явные триггеры записи (flush)
Определите конкретные условия, при которых контекст лога имеет значение, и добавьте явные вызовы записи:
- При исключениях или ошибках,
- Когда операции превышают ожидаемую продолжительность,
- Когда обнаружено что-то подозрительное.
3. Добавьте выборку логов для максимальной эффективности
Для приложений с большим объёмом логов используйте буферизацию и выборку:
- Фильтруйте обычные логи для уменьшения общего объёма,
- Буферизируйте подробные логи для записи контекста очистки при необходимости.
Ограничения
-.NET 9 и выше,
- Точный порядок логов может не сохраняться (временные метки сохраняются),
- Области (scope) логов не поддерживаются,
- Некоторые расширенные свойства записи логов (например, ActivitySpanId) не сохраняются.
Производительность
Буферизация логов — это компромисс между памятью и хранилищем:
- Буферизованные логи потребляют память, пока они не будут либо записаны, либо отброшены,
- Записывая логи только в определённых сценариях, вы можете радикально сократить расходы на хранение.
Для больших распределённых приложений накладные расходы памяти минимальны по сравнению с потенциальной экономией хранилища.
Источник: https://devblogs.microsoft.com/dotnet/emit-logs-on-demand-with-log-buffering/
👍10
День 2327. #ЧтоНовенького
Вам не Хватало Vim в Windows? Представляем Edit!
Edit — это новый текстовый редактор командной строки в Windows. Edit имеет открытый исходный код. Вы можете посмотреть код на GitHub или установить его, выполнив следующую команду:
Edit будет доступен для предварительного просмотра в программе Windows Insider в ближайшие месяцы. После этого он будет поставляться как часть Windows 11.
Как использовать?
Введите
Возможности
Edit — это небольшой, легкий текстовый редактор. Он занимает менее 250 КБ. Он пока находится на ранней стадии разработки, но у него есть несколько готовых функций:
1. Поддержка режима мыши
Пункты меню другие элементы UI поддерживают использование мыши, а также горячие клавиши.
2. Открытие нескольких файлов
Вы можете открыть несколько файлов в Edit и переключаться между ними с помощью
3. Поиск и замена
Вы можете найти и заменить текст с помощью
4. Перенос по словам
Edit поддерживает перенос по словам. Чтобы использовать перенос по словам, вы можете использовать
Зачем нам ещё один CLI-редактор?
Edit - текстовый редактор CLI по умолчанию в 64-разрядных версиях Windows. 32-разрядные версии Windows поставляются с редактором MS-DOS, но в 64-разрядных версиях редактор CLI не установлен.
В Microsoft решили, что нужен немодальный редактор для Windows (в отличие от модального редактора, в котором новым пользователям пришлось бы запоминать различные режимы работы и как переключаться между ними). К сожалению, это ограничило выбор списком редакторов, которые либо не имели собственной поддержки для Windows, либо были слишком большими, чтобы включать их в каждую версию ОС. В результате родился Edit.
Источник: https://devblogs.microsoft.com/commandline/edit-is-now-open-source/
Вам не Хватало Vim в Windows? Представляем Edit!
Edit — это новый текстовый редактор командной строки в Windows. Edit имеет открытый исходный код. Вы можете посмотреть код на GitHub или установить его, выполнив следующую команду:
winget install Microsoft.Edit
Edit будет доступен для предварительного просмотра в программе Windows Insider в ближайшие месяцы. После этого он будет поставляться как часть Windows 11.
Как использовать?
Введите
edit в командной строке или edit <your-file-name>, чтобы открыть файл. Теперь вы можете редактировать файлы непосредственно в командной строке без переключения контекста.Возможности
Edit — это небольшой, легкий текстовый редактор. Он занимает менее 250 КБ. Он пока находится на ранней стадии разработки, но у него есть несколько готовых функций:
1. Поддержка режима мыши
Пункты меню другие элементы UI поддерживают использование мыши, а также горячие клавиши.
2. Открытие нескольких файлов
Вы можете открыть несколько файлов в Edit и переключаться между ними с помощью
Ctrl+P (или щелкнув на список файлов в правом нижнем углу).3. Поиск и замена
Вы можете найти и заменить текст с помощью
Ctrl+R или выбрать Edit > Replace в меню. Также есть поддержка регистра и регулярных выражений.4. Перенос по словам
Edit поддерживает перенос по словам. Чтобы использовать перенос по словам, вы можете использовать
Alt+Z или выбрать View > Word Wrap в меню.Зачем нам ещё один CLI-редактор?
Edit - текстовый редактор CLI по умолчанию в 64-разрядных версиях Windows. 32-разрядные версии Windows поставляются с редактором MS-DOS, но в 64-разрядных версиях редактор CLI не установлен.
В Microsoft решили, что нужен немодальный редактор для Windows (в отличие от модального редактора, в котором новым пользователям пришлось бы запоминать различные режимы работы и как переключаться между ними). К сожалению, это ограничило выбор списком редакторов, которые либо не имели собственной поддержки для Windows, либо были слишком большими, чтобы включать их в каждую версию ОС. В результате родился Edit.
Источник: https://devblogs.microsoft.com/commandline/edit-is-now-open-source/
👍8👎1
День 2331. #ЧтоНовенького
Вышел .NET Aspire 9.3
Команда .NET выпустила версию 9.3 .NET Aspire, в которой представлены обновления для диагностики, интеграции и рабочих процессов развёртывания. Этот выпуск направлен на улучшение опыта разработчиков путём интеграции GitHub Copilot в панель управления Aspire, расширения возможностей трассировки и упрощения развёртываний в Azure.
Интеграция GitHub Copilot в панель управления Aspire (на первой картинке выше) позволяет разработчикам анализировать журналы, исследовать ошибки в распределённых сервисах и выявлять проблемы производительности с помощью ИИ, не покидая среду панели управления разработчика. По словам команды .NET, Copilot дополняет диагностику на основе OpenTelemetry, представляя саммари журналов, интерпретируя коды ошибок и помогая выявлять основные причины в сложных сценариях трассировки.
В панель управления Aspire было добавлено контекстное меню в представлении Resource Graph (на второй картинке выше), предлагающее быстрый доступ к данным телеметрии, специфичным для ресурсов командам и URL. Как отмечено в релизе, страница Traces теперь отображает исходящие вызовы к зависимостям, таким как базы данных и кэши, даже если эти сервисы не выдают собственную телеметрию. Эти обновления призваны предоставить разработчикам более широкую наблюдаемость поведения приложений.
Дополнительные улучшения удобства использования включают сохранение имён пользовательских ресурсов в URL в логах консоли, поддержание состояния фильтра на странице ресурсов и выдачу предупреждений при приостановке сбора метрик.
Улучшения интеграции Aspire включают поддержку размещения самостоятельно управляемого экземпляра YARP через пакет Aspire.Hosting.Yarp. Кроме того, интеграция с MySQL теперь позволяет создавать базу данных во время настройки хоста приложения:
Для контейнеризированных сервисов в выпуске представлены упрощенные API конфигурации для Postgres, Redis и SQL Server, позволяющие разработчикам указывать порты хоста и пароли с помощью метода RunAsContainer:
Интеграция с Azure также была расширена. Разработчики теперь могут создавать и добавлять контейнеры Blob Storage в AppHost. Были введены два новых API — AddAzureKeyVaultKeyClient и AddAzureKeyVaultCertificateClient — для упрощения доступа к Azure Key Vault для операций с ключами и сертификатами.
Функция Custom URLs в модели приложения была обновлена для поддержки относительных путей и большего контроля над видимостью. Новая перегрузка WithUrlForEndpoint позволяет прикреплять несколько конечных точек к одному ресурсу.
Для Azure App Service версия 9.3 представляет предварительную поддержку для развёртывания проектов .NET в ней. Поток развёртывания поддерживается через API AddAzureAppServiceEnvironment(…) и позволяет настраивать общие сценарии, такие как проекты .NET с одной конечной точкой, опубликованные в реестре контейнеров Azure:
Другие изменения в этом выпуске включают дополнительные улучшения CLI, улучшения диагностических визуальных элементов и расширенные параметры конфигурации контейнера.
Источник: https://www.infoq.com/news/2025/06/dotnet-aspire-93-release/
Вышел .NET Aspire 9.3
Команда .NET выпустила версию 9.3 .NET Aspire, в которой представлены обновления для диагностики, интеграции и рабочих процессов развёртывания. Этот выпуск направлен на улучшение опыта разработчиков путём интеграции GitHub Copilot в панель управления Aspire, расширения возможностей трассировки и упрощения развёртываний в Azure.
Интеграция GitHub Copilot в панель управления Aspire (на первой картинке выше) позволяет разработчикам анализировать журналы, исследовать ошибки в распределённых сервисах и выявлять проблемы производительности с помощью ИИ, не покидая среду панели управления разработчика. По словам команды .NET, Copilot дополняет диагностику на основе OpenTelemetry, представляя саммари журналов, интерпретируя коды ошибок и помогая выявлять основные причины в сложных сценариях трассировки.
В панель управления Aspire было добавлено контекстное меню в представлении Resource Graph (на второй картинке выше), предлагающее быстрый доступ к данным телеметрии, специфичным для ресурсов командам и URL. Как отмечено в релизе, страница Traces теперь отображает исходящие вызовы к зависимостям, таким как базы данных и кэши, даже если эти сервисы не выдают собственную телеметрию. Эти обновления призваны предоставить разработчикам более широкую наблюдаемость поведения приложений.
Дополнительные улучшения удобства использования включают сохранение имён пользовательских ресурсов в URL в логах консоли, поддержание состояния фильтра на странице ресурсов и выдачу предупреждений при приостановке сбора метрик.
Улучшения интеграции Aspire включают поддержку размещения самостоятельно управляемого экземпляра YARP через пакет Aspire.Hosting.Yarp. Кроме того, интеграция с MySQL теперь позволяет создавать базу данных во время настройки хоста приложения:
builder.AddMySql("mysql").AddDatabase("mydb");Для контейнеризированных сервисов в выпуске представлены упрощенные API конфигурации для Postgres, Redis и SQL Server, позволяющие разработчикам указывать порты хоста и пароли с помощью метода RunAsContainer:
var sql = builder.AddAzureSqlServer("sql");
sql.RunAsContainer(c =>
{
c.WithHostPort(12455);
});Интеграция с Azure также была расширена. Разработчики теперь могут создавать и добавлять контейнеры Blob Storage в AppHost. Были введены два новых API — AddAzureKeyVaultKeyClient и AddAzureKeyVaultCertificateClient — для упрощения доступа к Azure Key Vault для операций с ключами и сертификатами.
Функция Custom URLs в модели приложения была обновлена для поддержки относительных путей и большего контроля над видимостью. Новая перегрузка WithUrlForEndpoint позволяет прикреплять несколько конечных точек к одному ресурсу.
Для Azure App Service версия 9.3 представляет предварительную поддержку для развёртывания проектов .NET в ней. Поток развёртывания поддерживается через API AddAzureAppServiceEnvironment(…) и позволяет настраивать общие сценарии, такие как проекты .NET с одной конечной точкой, опубликованные в реестре контейнеров Azure:
builder.AddAzureAppServiceEnvironment("env");
builder.AddProject<Projects.Api>("api")
.WithExternalHttpEndpoints()
.PublishAsAzureAppServiceWebsite((infra, site) =>
{
site.SiteConfig.IsWebSocketsEnabled = true;
});Другие изменения в этом выпуске включают дополнительные улучшения CLI, улучшения диагностических визуальных элементов и расширенные параметры конфигурации контейнера.
Источник: https://www.infoq.com/news/2025/06/dotnet-aspire-93-release/
👍8
День 2343. #ЧтоНовенького
Вышел 5 Превью .NET 10. Начало
Microsoft объявили о выпуске .NET 10 превью 5, представив обновления для нескольких компонентов, включая ASP.NET Core, .NET MAUI, WPF и EF Core.
ASP.NET Core
1. Появилась возможность настраивать пользовательские дескрипторы безопасности для очередей запросов HTTP.sys через свойство RequestQueueSecurityDescriptor в HttpSysOptions. Это обеспечивает лучший контроль над доступом к очередям запросов на уровне ОС.
2. API валидации, поддерживающие Minimal API, были помечены как экспериментальные, чтобы разрешить будущие модификации, хотя API AddValidation верхнего уровня остаются стабильными.
3. Генерация OpenAPI была улучшена в версии 3.1. Выпуск также расширяет извлечение метаданных из XML-документации, распознавая теги <returns> и <response> для описаний ответов.
4. В Blazor представлен метод для более простого рендеринга страниц Not Found путем указания компонента NotFoundPage в конфигурации маршрутизатора. Этот подход имеет приоритет над старым фрагментом NotFound. Теперь страница NotFound.razor включена в шаблоны проектов по умолчанию и будет отображаться всякий раз, когда в приложении вызывается метод NavigationManager.NotFound():
5. Введены подробные метрики и возможности трассировки для приложений Blazor. Метрики публикуются через выделенные счетчики для компонентов, событий жизненного цикла и конвейеров сервера. Трассировка использует новый источник активности Microsoft.AspNetCore.Components, включающий подробный инструментарий для навигации, обработки событий и жизненных циклов конвейера. Разработчики могут включить эту диагностику, настроив OpenTelemetry для сбора данных из соответствующих источников и счётчиков:
Окончание следует…
Источник: https://www.infoq.com/news/2025/06/dotnet-10-preview-5/
Вышел 5 Превью .NET 10. Начало
Microsoft объявили о выпуске .NET 10 превью 5, представив обновления для нескольких компонентов, включая ASP.NET Core, .NET MAUI, WPF и EF Core.
ASP.NET Core
1. Появилась возможность настраивать пользовательские дескрипторы безопасности для очередей запросов HTTP.sys через свойство RequestQueueSecurityDescriptor в HttpSysOptions. Это обеспечивает лучший контроль над доступом к очередям запросов на уровне ОС.
2. API валидации, поддерживающие Minimal API, были помечены как экспериментальные, чтобы разрешить будущие модификации, хотя API AddValidation верхнего уровня остаются стабильными.
3. Генерация OpenAPI была улучшена в версии 3.1. Выпуск также расширяет извлечение метаданных из XML-документации, распознавая теги <returns> и <response> для описаний ответов.
4. В Blazor представлен метод для более простого рендеринга страниц Not Found путем указания компонента NotFoundPage в конфигурации маршрутизатора. Этот подход имеет приоритет над старым фрагментом NotFound. Теперь страница NotFound.razor включена в шаблоны проектов по умолчанию и будет отображаться всякий раз, когда в приложении вызывается метод NavigationManager.NotFound():
<Router AppAssembly="@typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>This content will be ignored because we have NotFoundPage defined.</NotFound>
</Router>
5. Введены подробные метрики и возможности трассировки для приложений Blazor. Метрики публикуются через выделенные счетчики для компонентов, событий жизненного цикла и конвейеров сервера. Трассировка использует новый источник активности Microsoft.AspNetCore.Components, включающий подробный инструментарий для навигации, обработки событий и жизненных циклов конвейера. Разработчики могут включить эту диагностику, настроив OpenTelemetry для сбора данных из соответствующих источников и счётчиков:
builder.Services
.ConfigureOpenTelemetryMeterProvider(p =>
{
p.AddMeter("Microsoft.AspNetCore.Components");
p.AddMeter("Microsoft.AspNetCore.Components.Lifecycle");
p.AddMeter("Microsoft.AspNetCore.Components.Server.Circuits");
});
builder.Services
.ConfigureOpenTelemetryTracerProvider(p =>
{
p.AddSource("Microsoft.AspNetCore.Components");
});
Окончание следует…
Источник: https://www.infoq.com/news/2025/06/dotnet-10-preview-5/
👍10
День 2344. #ЧтоНовенького
Вышел 5 Превью .NET 10. Окончание
Начало
MAUI
1. Добавлена поддержка глобальных и неявных пространств имён XAML. Это упрощает разметку, позволяя разработчикам использовать элементы управления без указания нескольких объявлений xmlns. Новое глобальное пространство имён может включать пользовательские представления, конвертеры и сторонние библиотеки, что позволяет сделать XAML более чистым и удобным для обслуживания. Функцию можно активировать через свойства проекта, что снижает необходимость в подробных объявлениях. Однако Microsoft отмечает, что могут возникать ошибки инструментов, пока эта функция остаётся в предварительной версии.
2. Добавлена возможность перехвата веб-запросов в HybridWebView благодаря обработке события WebResourceRequested. Можно изменять или блокировать запросы, позволяя использовать такие сценарии, как внедрение пользовательских заголовков или обслуживание локальных ресурсов:
WPF
1. Представлен сокращённый синтаксис для Grid.RowDefinitions и Grid.ColumnDefinitions, делая XAML более лаконичным и улучшая поддержку Hot Reload.
2. Улучшения шрифтов и глобализации включают добавление шрифта simsun-extg для улучшения рендеринга на восточноазиатских языках. Тема Fluent была усовершенствована, устраняя сбои и улучшая стили для макетов RTL. Повышение производительности было достигнуто за счёт сокращения выделения памяти и удаления неиспользуемых путей кода.
Entity Framework
В предыдущих версиях EF Core, когда вы указывали значение по умолчанию для свойства, EF Core всегда позволял базе данных автоматически генерировать имя ограничения. Теперь вы можете явно указать имя для ограничений значения по умолчанию для SQL Server, что даёт больше контроля над схемой БД:
Вы также можете вызвать UseNamedDefaultConstraints, чтобы включить автоматическое именование всех ограничений по умолчанию. Обратите внимание, что если у вас есть существующие миграции, то следующая добавленная миграция переименует каждое ограничение по умолчанию в модели:
Полный список новинок можно посмотреть здесь
Источник: https://www.infoq.com/news/2025/06/dotnet-10-preview-5/
Вышел 5 Превью .NET 10. Окончание
Начало
MAUI
1. Добавлена поддержка глобальных и неявных пространств имён XAML. Это упрощает разметку, позволяя разработчикам использовать элементы управления без указания нескольких объявлений xmlns. Новое глобальное пространство имён может включать пользовательские представления, конвертеры и сторонние библиотеки, что позволяет сделать XAML более чистым и удобным для обслуживания. Функцию можно активировать через свойства проекта, что снижает необходимость в подробных объявлениях. Однако Microsoft отмечает, что могут возникать ошибки инструментов, пока эта функция остаётся в предварительной версии.
2. Добавлена возможность перехвата веб-запросов в HybridWebView благодаря обработке события WebResourceRequested. Можно изменять или блокировать запросы, позволяя использовать такие сценарии, как внедрение пользовательских заголовков или обслуживание локальных ресурсов:
<HybridWebView WebResourceRequested="HybridWebView_WebResourceRequested" />
WPF
1. Представлен сокращённый синтаксис для Grid.RowDefinitions и Grid.ColumnDefinitions, делая XAML более лаконичным и улучшая поддержку Hot Reload.
2. Улучшения шрифтов и глобализации включают добавление шрифта simsun-extg для улучшения рендеринга на восточноазиатских языках. Тема Fluent была усовершенствована, устраняя сбои и улучшая стили для макетов RTL. Повышение производительности было достигнуто за счёт сокращения выделения памяти и удаления неиспользуемых путей кода.
Entity Framework
В предыдущих версиях EF Core, когда вы указывали значение по умолчанию для свойства, EF Core всегда позволял базе данных автоматически генерировать имя ограничения. Теперь вы можете явно указать имя для ограничений значения по умолчанию для SQL Server, что даёт больше контроля над схемой БД:
protected override void OnModelCreating(ModelBuilder mb)
{
mb.Entity<Blog>()
.Property(b => b.IsActive)
.HasDefaultValue(true, "DF_Blog_IsActive");
mb.Entity<Post>()
.Property(p => b.CreatedDate)
.HasDefaultValueSql("GETDATE()", "DF_Post_CreatedDate");
}
Вы также можете вызвать UseNamedDefaultConstraints, чтобы включить автоматическое именование всех ограничений по умолчанию. Обратите внимание, что если у вас есть существующие миграции, то следующая добавленная миграция переименует каждое ограничение по умолчанию в модели:
protected override void OnModelCreating(ModelBuilder mb)
{
mb.UseNamedDefaultConstraints();
}
Полный список новинок можно посмотреть здесь
Источник: https://www.infoq.com/news/2025/06/dotnet-10-preview-5/
👍4
День 2354. #ЧтоНовенького
ToListAsync в Entity Framework Снова Быстрый
Если вы извлекаете очень большую строку NVARCHAR(MAX) через await ToListAsync(), Entity Framework будет делать что-то непонятное, что приводит к медленному запросу и большому объёму выделения памяти. На самом деле, виновник не совсем Entity Framework. Основную работу выполняет базовый Microsoft.Data.SqlClient. Проблема в том, что он неправильно использует SqlDataReader.
Замечание: это касается в основном пакета/реализации для SqlServer, поскольку он использует пакет Microsoft.Data.SqlClient.
Вот вырезка из бенчмарка от @Wraith2:
Microsoft.Data.SqlClient 6.1.0
@Wraith2 исправил проблему серией пул-реквестов, на протяжении более 5 лет! Это невероятно. Конечно, он не работал над исправлениями непрерывно 5 лет, но всё равно это очень впечатляет. Последние заметки о выпуске можно прочитать здесь. Обратите внимание на материалы "Added packet multiplexing support to improve large data read performance" (Добавлена поддержка мультиплексирования пакетов для повышения производительности чтения больших объёмов данных).
А пул-реквест, исправляющий проблему, находится здесь.
Результаты такие:
Разрыв в выделении памяти в 20% всё ещё сохраняется, но время уже сопоставимо. Wraith2 и команда проделали потрясающую работу. Вы можете протестировать превью версию пакета, даже используя EF, поскольку прямые зависимости переопределяют транзитивные. Либо подождите следующего релиза EF, включающего новую версию Microsoft.Data.SqlClient 6.1.0, который должен уже скоро выйти.
Источник: https://steven-giesel.com/blogPost/dd7ab934-c311-45e0-9a04-9a28c624b957/tolistasync-is-fast-again-in-entity-framework-kind-of
ToListAsync в Entity Framework Снова Быстрый
Если вы извлекаете очень большую строку NVARCHAR(MAX) через await ToListAsync(), Entity Framework будет делать что-то непонятное, что приводит к медленному запросу и большому объёму выделения памяти. На самом деле, виновник не совсем Entity Framework. Основную работу выполняет базовый Microsoft.Data.SqlClient. Проблема в том, что он неправильно использует SqlDataReader.
Замечание: это касается в основном пакета/реализации для SqlServer, поскольку он использует пакет Microsoft.Data.SqlClient.
Вот вырезка из бенчмарка от @Wraith2:
| Method | Mean | Allocated |
|------- |----------:|----------:|
| Async | 757.51 ms | 101.49 MB |
| Sync | 39.40 ms | 80.14 MB |
Microsoft.Data.SqlClient 6.1.0
@Wraith2 исправил проблему серией пул-реквестов, на протяжении более 5 лет! Это невероятно. Конечно, он не работал над исправлениями непрерывно 5 лет, но всё равно это очень впечатляет. Последние заметки о выпуске можно прочитать здесь. Обратите внимание на материалы "Added packet multiplexing support to improve large data read performance" (Добавлена поддержка мультиплексирования пакетов для повышения производительности чтения больших объёмов данных).
А пул-реквест, исправляющий проблему, находится здесь.
Результаты такие:
| Async | 49.45 ms | 101.51 MB |
| Sync | 40.09 ms | 80.14 MB |
Разрыв в выделении памяти в 20% всё ещё сохраняется, но время уже сопоставимо. Wraith2 и команда проделали потрясающую работу. Вы можете протестировать превью версию пакета, даже используя EF, поскольку прямые зависимости переопределяют транзитивные. Либо подождите следующего релиза EF, включающего новую версию Microsoft.Data.SqlClient 6.1.0, который должен уже скоро выйти.
Источник: https://steven-giesel.com/blogPost/dd7ab934-c311-45e0-9a04-9a28c624b957/tolistasync-is-fast-again-in-entity-framework-kind-of
👍22
День 2357. #ЧтоНовенького #NET10
Разбираем Возможности dotnet run app.cs. Начало
В этой серии подробно разберём новую функцию, появившуюся в .NET 10, для сборки и запуска одного C#-файла без необходимости предварительного создания проекта .csproj. Похоже, у неё пока нет окончательного названия. В некоторых источниках её называют однофайловым приложением (file-based app), иногда - «runfile».
Что это?
В .NET 10 добавлена возможность сохранить код в один файл .cs и запустить его, выполнив команду
См. представление новой функции здесь.
Доступные функции
Пока возможности относительно ограничены, но есть несколько точек расширения. Следующий пример демонстрирует простое хост-приложение Aspire без операций, реализованное в виде однофайлового приложения. Он ничего не делает, а просто демонстрирует все функции, доступные в .NET 10 превью 5:
Этот скрипт демонстрирует все новые директивы, доступные в режиме запуска однофайлового приложения.
1. Создание исполняемого файла с помощью шебанг
#! (шебанг) и представляет директиву для систем *nix, позволяющую запускать файл напрямую. См. подробнее.
2. Добавление ссылок на SDK
Возможно с помощью директивы #:sdk. Также, как видите, можно указать версию. Заметьте, что в превью 5 она указывается через пробел, но, возможно, синтаксис поменяется для соответствия синтаксису добавления NuGet-пакетов.
3. Добавление ссылок на NuGet-пакеты
Возможно с помощью директивы #:package. Версия указывается после @. Можно использовать подстановочный знак (*) для версий:
Подстановочный знак обычно выберет наивысшую версию пакета.
4. Обновление свойств MSBuild
#:property используется для определения свойств MSBuild для приложения. Можно добавить любые свойства, которые обычно определяются в <PropertyGroup> файла .csproj. Здесь синтаксис, скорее всего тоже изменится. Вместо пробела нужно будет использовать =.
5. Ссылки на проекты (скоро)
В .NET 10 превью 6 должна появиться возможность ссылаться на проекты с помощью директивы #:project
Возможность ссылаться на каталог проекта вместо полного пути к файлу .csproj — отличный способ уменьшить дублирование.
Продолжение следует…
Источник: https://andrewlock.net/exploring-dotnet-10-preview-features-1-exploring-the-dotnet-run-app.cs/
Разбираем Возможности dotnet run app.cs. Начало
В этой серии подробно разберём новую функцию, появившуюся в .NET 10, для сборки и запуска одного C#-файла без необходимости предварительного создания проекта .csproj. Похоже, у неё пока нет окончательного названия. В некоторых источниках её называют однофайловым приложением (file-based app), иногда - «runfile».
Что это?
В .NET 10 добавлена возможность сохранить код в один файл .cs и запустить его, выполнив команду
dotnet run app.cs
См. представление новой функции здесь.
Доступные функции
Пока возможности относительно ограничены, но есть несколько точек расширения. Следующий пример демонстрирует простое хост-приложение Aspire без операций, реализованное в виде однофайлового приложения. Он ничего не делает, а просто демонстрирует все функции, доступные в .NET 10 превью 5:
#!/usr/bin/dotnet run
#:sdk Microsoft.NET.Sdk
#:sdk Aspire.AppHost.Sdk 9.3.0
#:package Aspire.Hosting.AppHost@9.3.0
#:property UserSecretsId 2eec9746-c21a-4933-90af-c22431f35459
using Microsoft.Extensions.Configuration;
var builder = DistributedApplication.CreateBuilder(args);
builder.Configuration.AddInMemoryCollection(new Dictionary<string, string?>
{
{ "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL", "https://localhost:21049" },
{ "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL", "https://localhost:22001" },
{ "ASPNETCORE_URLS", "https://localhost:17246" },
});
builder.Build().Run();
Этот скрипт демонстрирует все новые директивы, доступные в режиме запуска однофайлового приложения.
1. Создание исполняемого файла с помощью шебанг
#! (шебанг) и представляет директиву для систем *nix, позволяющую запускать файл напрямую. См. подробнее.
2. Добавление ссылок на SDK
Возможно с помощью директивы #:sdk. Также, как видите, можно указать версию. Заметьте, что в превью 5 она указывается через пробел, но, возможно, синтаксис поменяется для соответствия синтаксису добавления NuGet-пакетов.
3. Добавление ссылок на NuGet-пакеты
Возможно с помощью директивы #:package. Версия указывается после @. Можно использовать подстановочный знак (*) для версий:
#:package Aspire.Hosting.AppHost@*
#:package Aspire.Hosting.AppHost@9.*
#:package Aspire.Hosting.AppHost@9.3.*
Подстановочный знак обычно выберет наивысшую версию пакета.
4. Обновление свойств MSBuild
#:property используется для определения свойств MSBuild для приложения. Можно добавить любые свойства, которые обычно определяются в <PropertyGroup> файла .csproj. Здесь синтаксис, скорее всего тоже изменится. Вместо пробела нужно будет использовать =.
5. Ссылки на проекты (скоро)
В .NET 10 превью 6 должна появиться возможность ссылаться на проекты с помощью директивы #:project
#:project ../src/MyProject
#:project ../src/MyProject/MyProject.csproj
Возможность ссылаться на каталог проекта вместо полного пути к файлу .csproj — отличный способ уменьшить дублирование.
Продолжение следует…
Источник: https://andrewlock.net/exploring-dotnet-10-preview-features-1-exploring-the-dotnet-run-app.cs/
👍9