【问题标题】:Conditional reference in Visual Studio Community 2017Visual Studio Community 2017 中的条件引用
【发布时间】:2018-03-29 11:52:19
【问题描述】:

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

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

当我在 windows 上的 Visual Studio 2017 中构建项目时,我在输出中得到两个目录(netstandard2.0、net45)和相应的 dll。构建成功。

当我在 mac 上的 Visual Studio 2017 中构建完全相同的项目(相同的代码)时,我遇到了这种性质的错误:

“CommandLine.DotNetStandard, Version=1.0.30”和“CommandLine, Version=1.9.71.2”中都存在“OptionAttribute”类型

我通过以下方式有条件地引用了一个命令行解析器库:

  <!-- 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 上似乎没有观察到这种情况。这是 Mac 上 Visual Studio 的已知错误吗?我做错了吗?

【问题讨论】:

标签: msbuild nuget-package visual-studio-mac multitargeting msbuild-projectreference


【解决方案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 只是默默地忽略了这些条件,从而掩盖了真正的问题。
  • 这并没有解决我的问题,因为它一直忽略秒目标的条件。
【解决方案2】:

如果 MsBuild 仅考虑您的第一个 &lt;Choose/&gt; 或条件,那么您希望这样做:

 <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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多