Как указать конфигурацию сборки для ссылочных проектов при использовании `dotnet build` или` dotnet publish`? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть проект .NET Core 3, который ссылается на несколько других проектов. Мой основной корневой проект имеет конфигурацию сборки Release-X, но другие проекты имеют только конфигурацию Release, не соответствует конфигурации Release-X.

Когда я пытаюсь опубликовать мой основной корневой проект, используя это .. .

dotnet publish MyProject.csproj -c Release-X

... Похоже, что используется таинственная несуществующая конфигурация сборки по умолчанию для всех упомянутых проектов. (Я могу сказать, потому что упомянутые проекты допускают небезопасный код в всех их конфигураций сборки, но сборка с помощью приведенной выше команды приводит к ошибкам небезопасного кода.)

Я хочу иметь возможность собиратьМой основной корневой проект использует конфигурацию Release-X, но создает все проекты, на которые ссылаются, используя их конфигурации Release. Как мне это сделать?

1 Ответ

1 голос
/ 08 октября 2019

Значение конфигурации устанавливается как глобальное свойство , которое применяется на всем графе проекта, пока ссылка на проект не изменит это явно.

Существует три способа решенияс этим, но учтите, что это может привести к противоречивым результатам при сборке из Visual Studio или при создании файла .sln из командной строки из-за различий в логике восстановления NuGet (но это будет хорошо, если у вас нет атрибута Condition в пакете илиссылки на проекты в вашем csproj, которые зависят от $(Configuration))

  1. Установить явную конфигурацию для ссылочного проекта (я предлагаю использовать это):

    <Project Sdk="Microsoft.NET.Sdk">
      ....
      <PropertyGroup>
        <ReferencedConfiguration>$(Configuration)</ReferencedConfiguration>
        <ReferencedConfiguration Condition="'$(Configuration)' == 'Release-X'>Release</ReferencedConfiguration>
      </PropertyGroup>
      <ItemGroup>
        <ProjectReference Include="..\other\project.csproj" AdditionalProperties="Configuration=$(ReferencedConfiguration)" />
      </ItemGroup>
    </Project>
    
  2. Предотвращение прохождения глобальной конфигурации по ссылкам между проектами. Это нехорошо, потому что в целевом проекте он по умолчанию будет «Отладка», но это возможный способ справиться с этим:

    <Project Sdk="Microsoft.NET.Sdk">
      ...
      <ItemGroup>
        <ProjectReference Include="..\other\project.csproj" UndefineProperties ="Configuration" />
      </ItemGroup>
    </Project>
    
  3. Измените указанный проект, чтобы он не обрабатывался«Конфигурация» как глобальное свойство, если установлено и перезаписать его. Это должно произойти до импорта SDK, чтобы должным образом повлиять на всю логику, которая от него зависит:

    <Project TreatAsLocalProperty="Configuration">
      <PropertyGroup Condition="'$(Configuration)' != '' and '$(Configuration)' != 'Debug' and '$(Configuration)' != 'Release'>
        <Configuration>Release</Configuration>
      </PropertyGroup>
      <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
    
      .... (other project content)
    
      <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
    </Project>
    
...