在NuGet中打包项目引用:.NET Core

5

目前我有一个需求,我们需要将契约和实现分开为不同的程序集。创建NuGet包并尝试使用它时会失败,因为软件包管理器无法找到依赖项(契约)程序集。

这似乎是.NET Core中的一个已知问题。

https://github.com/dotnet/cli/issues/3959

不明白为什么在.NET Core中这样简单的事情不能正常工作。正在寻找解决此问题的方法。

3个回答

7

解决方案很简单,你有两个选项:

A) 把所有项目打包并发布为Nuget程序包:

你只需要将依赖项作为ProjectReference添加到主项目中,并继续使用项目引用进行开发。同时也必须将所有依赖项目一起打包。当你想要发布相同版本的程序包时,只需运行:

dotnet pack -p:PackageVersion=2.1.0 也可以添加任何其他pack参数

因为在pack期间,所有ProjectReference都会被转换成包依赖项。而且version号会级联到所有包中。

在这种情况下,你的原始主项目和它的所有依赖项都将被Nuget打包。现在你必须全部发布。当你想要安装你的Nuget程序包时,它将以指定的相同版本安装所有依赖项。

B) 将所有输出的DLL打包成一个Nuget程序包:

你可以将一个项目发布为Nuget程序包,并将所有其他DLL打包到该程序包中。首先禁止pack将依赖项从项目转换为程序包。找到你的ProjectReference并添加PrivateAssets="All"。应该像这样:

<ProjectReference Include="yourproj.csproj" PrivateAssets="All" />

将以下内容添加到您的 .csproj 文件中(要打包的项目),以打包依赖项DLL,请更改<PackagePath> 中的 DLL 名称和框架版本

<ItemGroup>
  <_PackageFiles Include="$(OutputPath)\yourproj.dll">
    <BuildAction>None</BuildAction>
    <PackagePath>lib\net5.0</PackagePath>
  </_PackageFiles>
</ItemGroup>

B) IDE不能识别<BuildAction>和<PackagePath>标签。 - Roman Prykhodko
关于方法A - 这种方法的关键点是什么?我可能理解不正确,但dotnet pack不包括引用。 - Roman Prykhodko
让我们在聊天中继续这个讨论 - Major
哎呀,这对我没用。我的项目目标是 netstandard2.1。 - Steve Boniface
1
不知道为什么包装总是那么烦人和复杂,但是谢谢老兄,方案B解决了我的问题。 - vpetkovic
显示剩余5条评论

1

0
在我的情况下,我通过向csproj文件添加以下部分来解决了这个问题。
  <ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)settings.json" />
    <BuildOutputInPackage Include="$(OutputPath)First.dll" />
    <BuildOutputInPackage Include="$(OutputPath)Second.dll" />
    <BuildOutputInPackage Include="$(OutputPath)Some.ico" />
    <BuildOutputInPackage Include="$(OutputPath)Even.exe" />
  </ItemGroup>

然后例如使用
dotnet build
dotnet pack MySolution/MyProject.csproj-c Release

进一步阅读:dotnet默认不打包exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接