2

背景:

我创建了一个针对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}”(您是否缺少程序集引用?)

    • 如果我第二次构建,正如第一个错误所暗示的那样,我会得到同样的错误。

  • 如果我在解决方案资源管理器中右键单击解决方案并在构建后选择 恢复 Nuget 包,它什么也不做,并说:所有包都已安装,没有什么可恢复的。

  • 如果我选择Tools > Nuget Package Manager > Package Manager Console 并输入命令dotnet restore,则构建将正常工作。

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

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

  • 我不需要向我的同事解释如何使用 Package Manager Console解决问题。
  • 我可以使用 TeamCity 等第三方工具构建此解决方案,无需额外设置。

失败的尝试:

以下是我迄今为止尝试过的一些事情:

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

更新

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

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

  • 我正在使用 VS 15.9.9


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

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

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

一些

此项目引用此计算机上缺少的 NuGet 包。使用 NuGet 包还原下载它们。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {path to project}\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets。

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

CS0234错误现在消失了。

4

1 回答 1

3

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

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

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

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
于 2019-07-09T12:23:38.067 回答