抑制单个编译器错误(例如NU1603)

时间:2018-06-18 04:08:16

标签: visual-studio msbuild nuget

是否可以抑制NuGet错误的单个实例?

我下面是NU1603,我相信我无法解决这个问题,而且我不想在整个项目中压制所有1603。

NU1603: runtime.native.System.IO.Compression 4.3.0 depends on runtime.win10-arm64.runtime.native.System.IO.Compression (>= 4.3.0) but runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.0 was not found. An approximate best match of runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.1 was resolved. NuGet package restore failed. Please see Error List window for detailed warnings and errors.

更新

重现警告的步骤如下:

  1. 创建一个面向16299的新Win IoT核心后台应用。
  2. Microsoft.Azure.Devices.Provisioning.Transport.Mqtt v1.1.1添加NuGet引用 (通过工具-> NuGet包管理器->管理解决方案的NuGet包...)
  3. 构建
  4. 尝试修复的额外步骤

    添加NuGet引用到System.IO.Compression 4.3.0(最新版)

    项目文件现在包含

    <PackageReference Include="System.IO.Compression"> <Version>4.3.0</Version> </PackageReference>

    添加<NoWarn>

    <PackageReference Include="System.IO.Compression"> <Version>4.3.0</Version> <NoWarn>NU1603</NoWarn> </PackageReference>

    警告仍然存在。 现在,

    更新2 27/06/2018

    这是项目文件:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
        <ProjectGuid>{1053DA3E-BC0F-47EA-946C-24EA813DB098}</ProjectGuid>
        <OutputType>winmdobj</OutputType>
        <AppDesignerFolder>Properties</AppDesignerFolder>
        <RootNamespace>BackgroundApplication1</RootNamespace>
        <AssemblyName>BackgroundApplication1</AssemblyName>
        <DefaultLanguage>en-US</DefaultLanguage>
        <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
        <TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
        <TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
        <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
        <EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>
        <FileAlignment>512</FileAlignment>
        <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
        <AllowCrossPlatformRetargeting>false</AllowCrossPlatformRetargeting>
        <PackageCertificateKeyFile>BackgroundApplication1_TemporaryKey.pfx</PackageCertificateKeyFile>
        <AppxPackage>true</AppxPackage>
        <ContainsStartupTask>true</ContainsStartupTask>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>bin\ARM\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <NoWarn>;2008</NoWarn>
        <DebugType>full</DebugType>
        <PlatformTarget>ARM</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
        <OutputPath>bin\ARM\Release\</OutputPath>
        <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <Optimize>true</Optimize>
        <NoWarn>;2008</NoWarn>
        <DebugType>pdbonly</DebugType>
        <PlatformTarget>ARM</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
        <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>bin\x64\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <NoWarn>;2008</NoWarn>
        <DebugType>full</DebugType>
        <PlatformTarget>x64</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
        <OutputPath>bin\x64\Release\</OutputPath>
        <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <Optimize>true</Optimize>
        <NoWarn>;2008</NoWarn>
        <DebugType>pdbonly</DebugType>
        <PlatformTarget>x64</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
        <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>bin\x86\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <NoWarn>;2008</NoWarn>
        <DebugType>full</DebugType>
        <PlatformTarget>x86</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
      </PropertyGroup>
      <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
        <OutputPath>bin\x86\Release\</OutputPath>
        <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
        <Optimize>true</Optimize>
        <NoWarn>;2008</NoWarn>
        <DebugType>pdbonly</DebugType>
        <PlatformTarget>x86</PlatformTarget>
        <UseVSHostingProcess>false</UseVSHostingProcess>
        <ErrorReport>prompt</ErrorReport>
        <Prefer32Bit>true</Prefer32Bit>
        <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
      </PropertyGroup>
      <PropertyGroup>
        <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
      </PropertyGroup>
      <ItemGroup>
        <Compile Include="StartupTask.cs" />
        <Compile Include="Properties\AssemblyInfo.cs" />
      </ItemGroup>
      <ItemGroup>
        <AppxManifest Include="Package.appxmanifest">
          <SubType>Designer</SubType>
        </AppxManifest>
        <None Include="BackgroundApplication1_TemporaryKey.pfx" />
      </ItemGroup>
      <ItemGroup>
        <Content Include="Properties\Default.rd.xml" />
        <Content Include="Assets\LockScreenLogo.scale-200.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\SplashScreen.scale-200.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\Square150x150Logo.scale-200.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\Square44x44Logo.scale-200.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\StoreLogo.png">
          <InProject>false</InProject>
        </Content>
        <Content Include="Assets\Wide310x150Logo.scale-200.png">
          <InProject>false</InProject>
        </Content>
      </ItemGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Transport.Mqtt">
          <Version>1.1.1</Version>
          <NoWarn>NU1603</NoWarn>
        </PackageReference>
        <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
            <NoWarn>NU1603</NoWarn>
          <Version>6.1.5</Version>
        </PackageReference>
        <PackageReference Include="System.IO.Compression">
          <Version>4.3.0</Version>
          <NoWarn>NU1603</NoWarn>
        </PackageReference>
      </ItemGroup>
      <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0' ">
        <VisualStudioVersion>15.0</VisualStudioVersion>
      </PropertyGroup>
      <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
      <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
           Other similar extension points exist, see Microsoft.Common.targets.
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="AfterBuild">
      </Target>
      -->
    </Project>
    

2 个答案:

答案 0 :(得分:1)

  

是否可以抑制NuGet错误的单个实例?

要实现此目的,您可以尝试为单个NuGet包runtime.native.System.IO.Compression 4.3.0禁止此NuGet编译器警告,而不是整个项目。

要取消单个NuGet包的特定警告:

  1. 在“解决方案资源管理器”中,选择要禁止的NuGet包 编译器警告。
  2. 从右键单击或上下文菜单中,选择“属性”。
  3. 在包的属性的NoWarn框中,输入警告 要为此包抑制的数字。如果你想 抑制多个警告,使用逗号分隔警告 号。
  4. 查看详细信息:Suppress warnings for NuGet packages

      

    在某些情况下,您可能希望禁止单个NuGet包的NuGet编译器警告,而不是整个项目。警告有用,因此您不希望在项目级别禁止它。例如,其中一个NuGet警告告诉您包可能与您的项目不完全兼容。如果你在项目级别禁止它并稍后添加一个额外的NuGet包,你永远不会知道它是否产生了兼容性警告。

    希望这有帮助。

答案 1 :(得分:0)

这是 NuGet 的一个众所周知的问题。

在完全正常的情况下,Nuget 确实会完全错误地发出警告 NU1603。

这已通过错误报告引起 NuGet 创建者的注意,

(见https://github.com/NuGet/Home/issues/5764

但他们似乎认为警告没有问题,因此他们认为错误报告是“设计使然”。

“Leo Liu-MSFT”在对该问题的另一个答案的评论中给出了解决此问题的方法,但它本身就应该是一个答案,所以这里是:

解决方法是在每个包的基础上在引用包时禁止显示此特定警告。

在您的项目文件中(当然是 PackageReference 样式而不是 packages.config 样式,对吗?)您有这样的条目:

<PackageReference Include="acme.AcmePackage">
  <Version>4.7.0</Version>
</PackageReference>

将它们替换为以下内容:

<PackageReference Include="acme.AcmePackage">
   <Version>4.7.0</Version>
   <NoWarn>NU1603</NoWarn>   
</PackageReference>

更多

您可能会在您的解决方案甚至没有参考的包裹中收到 NU1603!

例如,如果您的解决方案依赖于包 A 和 B,并且它们中的每一个都依赖于第三个包 C 的不同版本,则可能会发生这种情况。在这种情况下,NuGet 将对包 C 发出此警告。

解决此问题的方法是从依赖于 A 或 B 的每个项目中显式引用包 C,即使这些项目不依赖于 C,这样您就可以为 C 抑制 NU1603。< /p>

事实上,这个问题甚至可以在 3 个或更多的间接级别发生,这意味着你可能会在没有任何项目的情况下遇到这个问题在您的解决方案中引用任何包 A、B 或 C。当发生这种情况时,查找哪些项目间接引用 C 可能看起来是一项艰巨的任务,此时大多数人可能只是放弃每次面对 NU1603 的警告构建,因为根除该死的东西太麻烦了。

然而,这是可能的。您需要在解决方案文件夹中调用此命令:

nuget restore -Verbosity detailed -DisableParallelProcessing 

这将为您做两件事:

  • 打开详细的详细信息,以便您可以在处理过程中看到发出了哪个项目警告 NU1603。
  • 禁用并行处理,以便 NuGet 为每个项目发出的诊断消息不会混淆。

因此,通过了解导致 NU1603 发布的项目,您可以向这些项目添加必要的包引用和警告抑制,如上所述。