Найти в Дзене

Csproj-файл, что это, с чем едят и как можно его упростить. SDK-style .csproj.

Сегодня расскажу про тему, которую начинающие программисты, особенно использующие Visual Studio, часто упускают из виду. Упускают, потому что в VS сложно перейти в режим редактирования .csproj-файла, и он достаточно удобно редактируется через графический интерфейс. А вот в Rider это легко делается напрямую (тут писал подробнее про эту IDE). Когда мы программируем, мы даже не задумываемся, что происходит, когда мы запускаем сборку решения. Откуда компилятор знает, из каких файлов брать код, из каких не надо, какие ссылки на какие dll или nuget-пакеты использованы?
В целом, нам необязательно использовать какие-то сложные программы — весь код можно писать в блокноте, и запускать через терминал. Просто через IDE это удобнее и быстрее, но при сборке вся мишура от IDE отбрасывается и остаётся только суть:
Главным является .sln-файл (или .slnx, но об этом будет в следующих статьях) — файл Решения (Solution). Там указываются конфигурации решения, и то, какие проекты в каких конфигурациях соб
Оглавление

Сегодня расскажу про тему, которую начинающие программисты, особенно использующие Visual Studio, часто упускают из виду. Упускают, потому что в VS сложно перейти в режим редактирования .csproj-файла, и он достаточно удобно редактируется через графический интерфейс. А вот в Rider это легко делается напрямую (тут писал подробнее про эту IDE).

Структура C#-проекта

Когда мы программируем, мы даже не задумываемся, что происходит, когда мы запускаем сборку решения. Откуда компилятор знает, из каких файлов брать код, из каких не надо, какие ссылки на какие dll или nuget-пакеты использованы?

В целом, нам необязательно использовать какие-то сложные программы — весь код можно писать в блокноте, и запускать через терминал. Просто через IDE это удобнее и быстрее, но при сборке вся мишура от IDE отбрасывается и остаётся только суть:

Главным является .sln-файл (или .slnx, но об этом будет в следующих статьях) — файл Решения (Solution). Там указываются конфигурации решения, и то, какие проекты в каких конфигурациях собираются. Решение состоит из проектов, в каждом из которых главным является .csproj-файл, в котором указано, какие файлы входят в проект, какие ресурсы использованы, даются ссылки на nuget-пакеты и на другие проекты решения. Вот о нём мы сегодня и поговорим.


Старый стиль Csproj-файлов

Давайте посмотрим на какой-нибудь csproj-файл из моего блога. Например, тот что использовался в предыдущей статье. Открою через Visual Studio:*

Правой кнопкой на Проект — Выгрузить проект

Затем Изменить файл проекта.

-2


В формате без картинок можете посмотреть на
гитхабе (а ещё можете подписаться на меня там и поставить звёздочку репозиторию).

Итак, что мы видим в csproj-файле старого стиля:

  • много общей информации о проекте
  • конфигурации проекта и их настройки
  • указание на использованные ресурсы и dll, причём в довольно длинном виде:
(интересно, а зачем ссылка на Microsoft.CSharp? Чтобы никто на Python писать точно не начал?
(интересно, а зачем ссылка на Microsoft.CSharp? Чтобы никто на Python писать точно не начал?

Указание на все файлы проекта и их зависимости, если есть:

-4

В больших проектах это всё довольно сильно разрастается, но тут проект маленький, ещё терпимо.

В общем, получается 113 строк, немного, но для проекта из 7-8 файлов если честно перебор.


Давайте посмотрим, как выглядит csproj-файл проекта на шаблоне Nice3Point — SDK-style .csproj:

SDK-style .csproj-файл

Файл в удобно читаемом формате здесь.

-5
-6

Что у нас здесь получилось за 60 строк:

  • Описание конфигураций под 5 версий Revit, при этом указаны Debug и Release
  • В удобном формате указаны все ссылки на используемые nuget-пакеты
  • Нет никаких ссылок на базовые библиотеки C# — они просто есть по умолчанию, и всё
  • Нет ссылок на используемые файлы: все файлы с расширением .cs, .xaml и .resx попали в состав проекта автоматически
  • Ну и настройка <useWpf> позволила легко подключить библиотеки, связанные с WPF.
  • Ещё и Revit запустили при старте отладки

В общем, SDK-style .csproj более понятный и удобный. Старайтесь создавать проекты сразу на таких шаблонах, чтобы работать с удобными файлами, а с неудобными не работать

Как перейти со старого на новый в существующем проекте?

Есть 3 способа:

1. Утилита try-convert. Надо устанавливать утилиту и .Net 5, не самый удобный способ, поэтому не буду подробно его описывать.

2. Переписать вручную

Но есть и самый весёлый вариант — скормить наш csproj-файл ИИ-модели и попросить переписать под SDK-Style. Я так и сделал — вот как теперь выглядит csproj-файл:

-7

29 строк, ничего лишнего. Да, пока без магии вроде копирования в выходной каталог Ревита, но я такой задачи перед собой и не ставил. Зато теперь работать с csproj-файлом стало намного приятнее.

Чтобы код компилировался, надо удалить старые файлы app.config, packages.config и AssemblyInfo.cs:

-8

Заключение


Итоговый код можно посмотреть
здесь.
Не забывайте подписываться на
мой телеграм-канал о Revit API и до новых встреч!

-9