Visual studio .NETStandard多目标库包在生成时不会恢复 背景:

Visual studio .NETStandard多目标库包在生成时不会恢复 背景:,visual-studio,msbuild,nuget,.net-standard,multitargeting,Visual Studio,Msbuild,Nuget,.net Standard,Multitargeting,我创建了一个多目标库,目标是net40、net462和netstandard2.0。此库的目的是包装StackExchange.Redis和一些相关的重新连接逻辑。对于net40,我需要使用比新目标更旧的软件包版本。这是我的csproj文件: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net40;net462;netstandard2.0</Tar

我创建了一个多目标库,目标是
net40
net462
netstandard2.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>

net40;net462;netstandard2.0
2.0.513
2.0.513
1.1.608
通常,这个库似乎可以工作,并且可以被不同目标框架上的应用程序使用


问题: 我现在遇到的问题是试图为这个项目恢复nuget包

  • 当我在Visual Studio中构建时

    • 我从以下项目中得到了一些此类错误的实例: 间接引用我的多目标项目:

      生成还原了NuGet包。再次构建项目以在构建中包含这些包。有关详细信息,请参阅

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

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

    • 如果我再次构建,正如第一个错误所表明的,我会得到相同的错误

  • 如果我在解决方案资源管理器中右键单击解决方案并选择 在构建之后恢复Nuget软件包,它什么也不做,并且说:所有软件包都已经安装,没有任何东西需要恢复

  • 如果我选择工具>Nuget软件包管理器>软件包管理器控制台 然后输入命令
    dotnetrestore
    ,构建将正常工作

该项目是解决方案中唯一使用多目标和csproj
包参考格式的项目

我需要将恢复包集成到我的构建中,以便

  • 我不需要向我的同事解释如何使用 包管理器控制台
  • 我可以使用第三方工具(如TeamCity)构建此解决方案,而无需额外设置

失败的尝试: 到目前为止,我已经尝试了以下几点:

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

更新
  • 从命令行中,我得到数百个CS0246(找不到名称空间名称“Foo”的类型(是否缺少using指令或程序集引用?)和CS0234错误,有些错误甚至引用了基类库(如System.Net)中的类型。使用
    -restore
    开关似乎不会改变这一点。由于那里的产量,我可能忽略了一些东西

  • 下面是一个显示类似行为的最小示例 它会生成一个CS0246错误,这有点不同。在package manager控制台中尝试
    dotnet restore
    时,它仍然失败

  • 我使用的是VS15.9.9


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

这稍微改变了我的错误。我发布的回购示例可能不够复杂。我现在得到很多钱

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

一些

此项目引用此计算机上缺少的NuGet包。使用NuGet Package Restore下载它们。有关详细信息,请参阅。缺少的文件是{path to project}\packages\Microsoft.Bcl.Build.1.0.21\Build\Microsoft.Bcl.Build.targets

还有一些像我以前遇到的
CS0246
错误


CS0234
错误现已消失。

您正在引用经典csproj文件中基于PackageReference的项目

默认情况下,这意味着您需要手动将nuget软件包安装到classic项目,因为它不使用PackageReference的可传递行为

要解决此问题,可以将以下内容添加到经典csproj文件的

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
PackageReference

您所说的“未恢复”是什么意思?你怎么查的?(
obj\project.assets.json
文件应生成),如果不手动运行还原,是否存在生成错误?@MartinUllrich更新了“问题”部分,其中包含更多错误消息详细信息您使用的是哪个版本的Visual Studio?您好,如果在命令行中生成项目,结果如何?(在命令中添加-restore开关)若你们能分享一个最小的可复制样本(请删除其中的所有核心代码和个人数据),那个就更好了