Условная ссылка в Visual Studio Community 2017

Я создаю мультиплатформенное приложение. У меня есть многоцелевая общая библиотека (нацеленная на.netstandard 2.0 и.net 4.5)... См. Файл проекта:

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
  </PropertyGroup>

Когда я строю проект в Visual Studio 2017 для Windows, я получаю две директории на выходе (netstandard2.0, net45) и соответствующие библиотеки DLL. Сборка удалась.

Когда я строю точно такой же проект (тот же код) в Visual Studio 2017 на Mac, я получаю ошибки такого рода:

Тип "OptionAttribute" существует в "CommandLine.DotNetStandard, версия =1.0.30" и "CommandLine, версия =1.9.71.2".

Я условно ссылался на библиотеку парсера командной строки следующим образом:

  <!-- CommandLineParser library -->
  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="CommandLine.DotNetStandard">
      <Version>1.0.3</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net45'">
    <PackageReference Include="CommandLineParser">
      <Version>1.9.71</Version>
    </PackageReference>
  </ItemGroup>

Это прекрасно работает для Windows, но на Mac кажется, что он не соблюдает условие. Это известная ошибка для Visual Studio на Mac? Я делаю что-то неправильно?

1 ответ

Решение

Visual Studio игнорирует условие в этих случаях. Использовать Choose/When вместо этого это должно быть полностью поддержано: https://msdn.microsoft.com/en-us/library/ms164282.aspx

<Choose> 
  <When Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <ItemGroup>
      <PackageReference Include="CommandLine.DotNetStandard">
        <Version>1.0.3</Version>
      </PackageReference>
    </ItemGroup>
  </When>
  <When Condition=" '$(TargetFramework)' == 'net45' ">
    <ItemGroup> 
      <PackageReference Include="CommandLineParser">
        <Version>1.9.71</Version>
      </PackageReference>
    </ItemGroup>
  </When>
</Choose>

Если MsBuild учитывает только ваш первый <Choose/> или условие, тогда вы хотите сделать это:

 <Choose>
    <When Condition="'$(Configuration)'=='Debug'">
      <ItemGroup>
        <ProjectReference Include="..\path\to_your_project.csproj" />
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
        <PackageReference Include="Package-Name" Version="1.0.0"/>
      </ItemGroup>
    </Otherwise>
  </Choose>
Другие вопросы по тегам