MSBuild Устанавливает свойство, влияющее на восстановление/построение зависимостей проекта

#c# #.net #msbuild

Вопрос:

У меня есть общая библиотека, которая должна использоваться как проектами .Net 5, так и проектами .Net Framework 4.8. Из-за других сложностей в процессе построения, то невозможно, чтобы просто иметь несколько TargetFrameworks определенными в общей библиотеке, так что я хочу использовать MSBuild свойство динамически устанавливается, если общая библиотека должна быть ориентирована .Объем 5 или .Чистая Рамках 4.8. Этот подход работает, когда я передаю флаг собственность с помощью MSBuild С ( /p:Net48=True ), но не когда я определяю свойства MSBuild непосредственно в файле csproj.

Ниже приведен простой пример того, что я пытаюсь сделать:

Проект А:

 lt;Project Sdk="Microsoft.NET.Sdk"gt;   lt;PropertyGroupgt;  lt;TargetFrameworkgt;net5.0lt;/TargetFrameworkgt;  lt;/PropertyGroupgt;   lt;ItemGroupgt;  lt;ProjectReference Include="..CC.csproj" /gt;  lt;/ItemGroupgt;  lt;/Projectgt;  

Проект В:

 lt;Project Sdk="Microsoft.NET.Sdk"gt;   lt;PropertyGroupgt;  lt;TargetFrameworkgt;net48lt;/TargetFrameworkgt;  lt;/PropertyGroupgt;   lt;PropertyGroupgt;  lt;Net48gt;Truelt;/Net48gt;  lt;/PropertyGroupgt;   lt;ItemGroupgt;  lt;ProjectReference Include="..CC.csproj" /gt;  lt;/ItemGroupgt;  lt;/Projectgt;  

Проект C (Общая библиотека):

 lt;Project Sdk="Microsoft.NET.Sdk"gt;   lt;PropertyGroupgt;  lt;TargetFramework Condition="'$(Net48)' == ''"gt;net5.0lt;/TargetFrameworkgt;  lt;TargetFramework Condition="'$(Net48)' != ''"gt;net48lt;/TargetFrameworkgt;  lt;/PropertyGroupgt;  lt;/Projectgt;  

Запуск dotnet build B.csproj /p:Net48=True создает проект при dotnet build B.csproj сбое. Разве определение свойства lt;Net48gt;Truelt;/Net48gt; не должно оказывать такое же влияние, как установка флага?

Ответ №1:

Разве определение свойства True не должно оказывать такое же влияние, как установка флага?

Нет свойства, установленные в проекте не распространяются на проекты, на которые ссылается проект, поэтому, когда вы выполняете dotnet build B.csproj свойство Net48 не определено в Project C. Однако, набор свойств в командной строке применяются глобально для всех проектов (и имеют приоритет в отношении имущества, значения, заданные статически в файле проекта) поэтому, установив его в командной строке работает.

На самом деле в этом случае вам не нужна какая-либо специальная условная логика, поскольку проекты в стиле SDK поддерживают создание нескольких целевых платформ.

Просто измените свой проект C на следующий:

 lt;Project Sdk="Microsoft.NET.Sdk"gt;   lt;PropertyGroupgt;  lt;!-- See https://docs.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#targetframeworks --gt;   lt;TargetFrameworksgt;net48;net5.0lt;/TargetFrameworksgt;  lt;/PropertyGroupgt;   lt;Target Name="DisplayTargetInfo" BeforeTargets="Build"gt;  lt;Message Importance="high" Text="$(MSBuildProjectName) TargetFramework = $(TargetFramework)" /gt;  lt;/Targetgt; lt;/Projectgt;