Start Debugging

.NET 11 Preview 5 позволяет file-based приложениям ссылаться друг на друга через `#:ref`

.NET 11 Preview 5 добавляет директиву #:ref, чтобы скрипт dotnet run мог ссылаться на другое file-based приложение как на библиотеку, с транзитивными ссылками и без файла проекта.

File-based приложения начинались как способ запустить один файл .cs через dotnet run без проекта. В .NET 10 они научились #:include, который подтягивает дополнительные файлы в одну компиляцию. .NET 11 Preview 5 идёт дальше: новая директива #:ref позволяет одному file-based приложению ссылаться на другое file-based приложение как на библиотеку, и транзитивные ссылки поддерживаются. .csproj не требуется.

Чем #:ref отличается от #:include

Различие реальное, а не косметическое. #:include сливает другой файл в ту же единицу компиляции, поэтому всё оказывается в одной сборке. #:ref рассматривает цель как отдельную библиотеку и ссылается на неё, так же как это сделал бы ProjectReference, только проекта нет ни с одной из сторон.

Это означает, что #:ref даёт вам настоящую границу. Файл, на который ссылаются, компилируется сам по себе, предоставляет свои публичные типы, а потребитель линкуется с ним. Вы получаете переиспользование между скриптами без копирования вспомогательных функций и без создания библиотеки классов.

Пример из двух файлов, который можно запустить

Поместите небольшую библиотеку в lib.cs:

// lib.cs
namespace MyLib;

public static class Greeter
{
    public static string Greet(string name) => $"Hello, {name}!";
}

Сошлитесь на неё из app.cs:

// app.cs
#:ref lib.cs

Console.WriteLine(MyLib.Greeter.Greet("World"));

Запустите с SDK .NET 11 Preview 5:

dotnet run app.cs

Если lib.cs сам несёт #:ref на третий файл, эта ссылка проходит насквозь. Транзитивные ссылки разрешаются, поэтому вы можете собрать небольшой граф скриптов так же, как собрали бы небольшой граф проектов.

Директивы больше не закрыты флагом

Другая новость в Preview 5 в том, что директивы file-based приложений #:include, #:exclude и #:project больше не требуют feature flag, а директивы внутри включённых файлов теперь обрабатываются транзитивно. Так что #:include может дотягиваться до вложенных файлов, а #:project может направить скрипт на настоящий .csproj, когда вы перерастёте схему «только скрипты».

Это даёт вам плавный переход вместо обрыва. Начните с одного файла. Вынесите вспомогательные функции через #:include. Повысьте вспомогательную функцию до переиспользуемой библиотеки через #:ref. Подключите полноценный проект через #:project, когда вещь перестанет быть скриптом. Каждый шаг — это одна строка директивы, и ни один из них не заставляет вас отказаться от dotnet run.

Где это пригодится

#:ref нацелен на ту же аудиторию, что и остальная работа над file-based приложениями: скрипты для tooling, примеры, воспроизведения и тот связующий код, который никогда не заслуживал файла решения. Новая граница делает такие скрипты переносимыми без перетаскивания церемоний MSBuild. Это предварительная возможность, поэтому опробуйте её на SDK .NET 11 Preview 5 и прочитайте примечания к выпуску SDK, чтобы узнать точное поведение, прежде чем на неё опираться.

Comments

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

< Назад