生成时无法还原.NETStandard多目标库软件包

时间:2019-07-08 15:34:18

标签: visual-studio msbuild nuget .net-standard multitargeting

背景:

我创建了一个针对net40net462netstandard2.0的多目标库。该库的目的是包装StackExchange.Redis和一些相关的重新连接逻辑。对于net40,我需要使用比较新目标版本更旧的软件包。这是我的csproj文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net40;net462;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="StackExchange.Redis">
      <Version>2.0.513</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net462'">
    <PackageReference Include="StackExchange.Redis">
      <Version>2.0.513</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net40'">
    <PackageReference Include="StackExchange.Redis.StrongName">
      <Version>1.1.608</Version>
    </PackageReference>
  </ItemGroup>

</Project>

通常,该库似乎可以工作,并且可以由不同目标框架上的应用程序使用。


问题:

我现在遇到的问题是试图恢复该项目的nuget软件包。

  • 在Visual Studio中构建时,

    • 我从该项目获得了一些此错误的实例 间接引用我的多目标项目:

      该版本已还原NuGet软件包。再次构建项目以将这些包包括在构建中。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=317568.

    • 我还从直接或间接引用我的多目标库的各种项目中获得了更多此错误的实例。 {Identifier}{Namespace}有所不同,有些引用了我的多目标库中的实体,有些引用了依赖该实体的项目中的实体。

      CS0234 名称空间“ {Namespace}”中不存在类型或名称空间名称“ {Identifier}”(您是否缺少程序集引用?)

    • 如果我第二次建造,如第一个错误所示,我将得到相同的错误。

  • 如果我在 Solution Explorer 中右键单击解决方案,然后选择 恢复Nuget程序包,在构建后不执行任何操作,并说:所有程序包均已安装,没有任何内容可恢复。

  • 如果我选择工具> Nuget软件包管理器>软件包管理器控制台 并输入命令dotnet restore,该版本将正常运行。

该项目是解决方案中唯一使用多目标和csproj <PackageReference>包引用格式的项目。

我需要还原软件包以将其集成到构建中,以便

  • 我不需要向我的同事解释如何使用 Package Manager控制台
  • 我可以使用TeamCity等第三方工具来构建此解决方案,而无需进行其他设置。

尝试失败:

到目前为止,我已经尝试了以下方法:

  • 添加了dotnet restore作为项目的预构建事件。这什么也没做。
  • 使用了 Visual Studio解决方案构建事件扩展程序来运行dotnet restore作为解决方案预构建事件。这可以在本地使用,但是该扩展通常是不可靠的,并且对TeamCity等第三方构建没有帮助。
  • 更新csproj文件以使用带有packages.config文件的旧程序包参考格式。这引入了许多新的构建错误。

更新

  • 从命令行中,我得到数百个CS0246(找不到名称空间名称'Foo'的类型(您是否缺少using指令或程序集引用?)), CS0234错误,有些甚至引用诸如System.Net之类的基类中的类型。使用-restore开关似乎并没有改变。由于那里的输出量很大,我可能会忽略一些东西。

  • 这是一个最小的示例,显示了类似的行为https://github.com/JamesFaix/RestoreFailExample 它会产生一个CS0246错误,但略有不同。当我在软件包管理器控制台中尝试dotnet restore时,它仍然仍然失败。

  • 我正在使用VS 15.9.9


我尝试了@Martin Ulrich的解决方案。如果不更新我的csproj文件中的引用并删除package.config文件,这似乎不起作用。为此,我使用了Visual Studio从旧格式到PackageReference格式的内置转换。

这稍微改变了我的错误。我发布的示例仓库可能还不够复杂。我现在有很多

找不到{项目文件夹} \ packages.config。确保此项目已安装Microsoft.Bcl.Build,并且packages.config位于项目文件旁边。

一些

该项目引用了此计算机上缺少的NuGet软件包。使用NuGet软件包还原下载它们。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=322105。丢失的文件是{项目路径} \ packages \ Microsoft.Bcl.Build.1.0.21 \ build \ Microsoft.Bcl.Build.targets。

和我以前遇到的一些CS0246错误。

CS0234错误现在消失了。

1 个答案:

答案 0 :(得分:3)

您要从经典的csproj文件引用基于PackageReference的项目。

默认情况下,这意味着您需要手动将nuget软件包安装到经典项目中,因为它没有使用PackageReference的传递行为。

要变通解决此问题,您可以将以下内容添加到经典csproj文件的<PropertyGroup>中:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
相关问题