目前我有一个需求,我们需要将契约和实现分开为不同的程序集。创建NuGet包并尝试使用它时会失败,因为软件包管理器无法找到依赖项(契约)程序集。
这似乎是.NET Core中的一个已知问题。
https://github.com/dotnet/cli/issues/3959
不明白为什么在.NET Core中这样简单的事情不能正常工作。正在寻找解决此问题的方法。
目前我有一个需求,我们需要将契约和实现分开为不同的程序集。创建NuGet包并尝试使用它时会失败,因为软件包管理器无法找到依赖项(契约)程序集。
这似乎是.NET Core中的一个已知问题。
https://github.com/dotnet/cli/issues/3959
不明白为什么在.NET Core中这样简单的事情不能正常工作。正在寻找解决此问题的方法。
解决方案很简单,你有两个选项:
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>
阅读文档后,我了解到 .net core 不鼓励使用项目引用,而是建议使用包引用。这在以下文档的描述标题中提到。
https://github.com/dotnet/docs/blob/master/docs/core/tools/dotnet-pack.md
我将我的合同程序集发布到了NuGet包,并在实现中作为NuGet包使用。 <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