Что такое файл Nuget Props и для чего он используется? - PullRequest
0 голосов
/ 19 декабря 2018

Я много осматриваюсь и читаю, но не могу найти однозначного ответа, который бы объяснил, что такое файл "nuget.props" и для чего он используется?

Любое объяснение и, возможно, примербыло бы полезно?

1 Ответ

0 голосов
/ 21 декабря 2018

Начиная с некоторой справочной информации, проекты .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, но это возможно.

...