Visual Studio Community 2017中的条件参考

use*_*167 11 msbuild multitargeting nuget-package msbuild-projectreference visual-studio-mac

我正在创建一个多平台应用程序.我有一个多目标共享库(目标.netstandard 2.0和.net 4.5)...请参阅项目文件:

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

当我在Windows上的visual studio 2017中构建项目时,我在输出中有两个目录(netstandard2.0,net45)和相应的dll.构建是成功的.

当我在Mac上的visual studio 2017中构建完全相同的项目(相同的代码)时,我得到了这种性质的错误:

类型'OptionAttribute'存在于'CommandLine.DotNetStandard,Version = 1.0.30'和'CommandLine,Version = 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>
Run Code Online (Sandbox Code Playgroud)

这适用于Windows,但在Mac上它似乎没有观察到这种情况.这是mac上visual studio的已知错误吗?难道我做错了什么?

jes*_*ing 16

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>
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是很糟糕,msbuild只是默默地忽略了条件,从而掩盖了真正的问题。 (3认同)