首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建时,.NETStandard多目标库包不会恢复。

构建时,.NETStandard多目标库包不会恢复。
EN

Stack Overflow用户
提问于 2019-07-08 15:34:18
回答 1查看 1.4K关注 0票数 2

背景:

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

代码语言:javascript
复制
<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包。

  • 当我在中构建时,
代码语言:javascript
复制
- I get several instances of this error coming from projects that indirectly reference my multi-targeting project:

构建恢复了NuGet包。再次构建项目,以将这些包包含在生成中。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=317568._

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

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

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

  • 如果我在解决方案资源管理器中右键单击该解决方案,并在构建后选择restore Nuget软件包,它将什么也不做,并说:所有包都已经安装,没有什么可恢复的。
  • 如果我选择Tools > Nuget > Package并输入命令dotnet restore,那么构建将正常工作。

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

我需要还原包,以便集成到我的构建中,以便

  • 我不需要向我的同事解释如何使用Package控制台进行工作。
  • 我可以使用第三方工具(如TeamCity )构建这个解决方案,而不需要额外的设置。

失败的尝试:

以下是我迄今尝试过的几件事:

  • 添加了dotnet restore作为项目预构建事件。这没什么用。
  • 使用Visual解决方案生成事件扩展将dotnet restore作为解决方案构建前事件运行。这在本地是可行的,但是这个扩展通常是不可靠的,而且也无助于第三方构建,比如TeamCity。
  • 使用packages.config文件更新csproj文件以使用旧的包引用格式。这就引入了许多新的构建错误。

更新

  • 在命令行中,我得到了数百个CS0246 (找不到名称空间名称'Foo‘的类型(您缺少一个使用指令还是程序集引用?)和CS0234错误,有些甚至引用了System.Net这样的基类库中的类型。使用-restore开关似乎不会改变这一点。由于那里的产量,我可能忽略了一些东西。
  • 下面是一个很小的示例,它显示了类似的行为-- https://github.com/JamesFaix/RestoreFailExample --它生成一个CS0246错误,这有点不同。当我在包管理器控制台中尝试dotnet restore时,它仍然失败。
  • 我使用的是VS 15.9.9

我试过马丁·乌尔里希的解决方案。如果不更新我的csproj文件中的引用并删除package.config文件,这似乎是行不通的。为此,我使用了Visual从旧格式到PackageReference格式的内置转换。

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

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

几个

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

还有一些CS0246错误,就像我以前遇到的那样。

CS0234错误现在消失了。

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 12:23:38

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

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

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

代码语言:javascript
复制
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56938270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档