Начиная с некоторой справочной информации, проекты .NET создаются с помощью MSBuild.AC # project .csproj
- это просто файл проекта MSBuild с расширением файла, который по соглашению сигнализирует, что это C #, а не какой-то другой язык, но для MSBuild это просто файл проекта.MSBuild имеет только несколько базовых типов, свойств, элементов, целей и задач.По соглашению свойства и элементы помещаются в файлы с расширением .props
, а задачи и цели - в файлы, заканчивающиеся на .targets
.Поэтому, если вы посмотрите на файлы csproj
старого стиля, вы увидите <Import Project="path\to\Microsoft.Common.CSharp.props" />
и <Import Project="path\to\Microsoft.Common.CSharp.props" />
.Новые проекты в стиле SDK - это в основном синтаксический сахар , позволяющий делать то же самое.
Затем команды MSBuild и .NET сделали систему сборки расширяемой.Таким образом, вместо того, чтобы ограничиваться тем, что Microsoft встроила в систему компилятора / сборки C #, вы можете заменить части системы сборки или добавить в нее дополнительные элементы.Без NuGet способ сделать это - создать собственный файл .props
и .targets
, а затем отредактировать .csproj
и добавить операторы <Import ... />
.Это может хорошо работать, если ваши реквизиты и цели находятся в том же хранилище исходного кода, что и используемый им, но редактирование вашего csproj и жесткое кодирование пути к файлам props
и targets
не работают так хорошо, иначе.
NuGet может помочь с этим.Если вы создадите пакет с соответствующими соглашениями , NuGet позаботится о том, чтобы реквизиты и цели были обнаружены и использованы в сборке.В проектах, использующих packages.config
, NuGet будет редактировать csproj
для вас при установке / обновлении / удалении.В проектах, использующих PackageReference
, NuGet запишет файл в промежуточный каталог (obj/
папка) с именами nuget.g.props
и nuget.g.targets
, который импортирует все файлы props
и targets
из всех упомянутых пакетов NuGet, исистема сборки использует эти файлы.
Первый пример, который я мог бы подумать о том, почему кто-то захочет сделать это, если вы хотите использовать более новую версию компилятора .NET, чем установлена в вашей системе.Просто обратитесь к пакету Microsoft.Net.Compilers , и .props
и .targets
в пакете заменит цели / задачи компиляции в установленной системой сборочной системе и будет использовать тот из пакетавместо.Это позволяет вам использовать новые языковые функции до того, как компилятор установлен в вашей системе, или если вы хотите убедиться, что все сборки вашего кода используют один и тот же компилятор, даже если у разных разработчиков или агентов CI установлены разные версии вещей.
Другим примером могут быть предварительно скомпилированные скрипты.Если у вас есть свой собственный язык сценариев, создайте инструменты сборки, которые преобразуют их в файлы C #, затем напишите реквизиты и цели MSBuild, которые будут выполняться перед «реальной сборкой» для преобразования вашего собственного языка в C #, сохраните сгенерированные файлы .cs
вВ промежуточную папку добавьте элементы MSBuild Compile для этих сгенерированных файлов, затем компилятор C # скомпилирует его со всеми остальными .cs
файлами в проекте.Вам потребуются достаточные знания MSBuild и системы сборки .NET, но это возможно.