项目生成了一个NuGet包,该包依赖于另一个没有创建NuGet包的项目。

8
如果我有一个构建nuget包的项目(P1),并使其依赖于不构建nuget包的项目(P2),生成的包仍将引用P2作为nuget包。

复现步骤

  • 创建一个包含2个C#项目(P1和P2)的解决方案
  • 使P1依赖于P2。
  • 向P1.csproj添加以下行(使其构建nuget包)

    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

  • 构建解决方案
  • 在例如NuGet Package Explorer中打开生成的P1.nupkg

请注意,NuGet包依赖于另一个名为P2的NuGet包。但是,该包不存在,并且永远不会存在,因为我没有告诉P2项目构建nuget包。

问题

我该如何强制 P2.dll 包含在 P1.nupkg 的 lib 文件夹中?理想情况下,它仅会强制对不创建 NuGet 包的引用生效。
其他问题
- 将 .NET Standard 库打包为 NuGet 包并包含所有项目依赖项 / 引用 相关,但假设使用 nuget pack。我正在使用 dotnet build 或 Visual Studio 构建 NuGet 包,因此不适用。 - 此 GitHub 查询 与我的问题几乎相同。

P1 是一个库还是应用程序项目?它有 nuspec 文件吗,还是通过项目属性配置包?对于使用 nuspec 文件的 NuGet 包,您可以在此处阅读如何包含其他文件:https://learn.microsoft.com/de-de/nuget/reference/nuspec#including-assembly-files(但请注意,与 Microsoft 所写的相反,<files> 元素不支持通配符!)。对于没有 nuspec 文件的新格式,我不知道如何包含其他文件。 - Nicolas
假设P1P2都是库(但这有什么区别吗?)。目前它没有nuspec文件,因为我正在使用新的“精简”项目格式,这应该使其大体上冗余。请注意,我希望通过Visual Studio或dotnet build进行构建 - 我实际上并没有使用nuget pack或类似工具... - RB.
1
区别在于,应用程序项目不支持新格式,并仍使用旧的项目格式,因此肯定会出现问题。但是,由于您正在使用新格式,您有三个选项:a)自动使其工作,b)降级项目格式并使用nuspec手动包含P2,或c)尝试手动包含P2,使用新格式-我找到了这个,但迄今为止还没有尝试过:https://tyrrrz.me/Blog/Additional-NuGet-files-in-new-csproj - Nicolas
2个回答

10

其中一种解决方法是将您不想包含的任何资源标记为<PrivateAssets>all</PrivateAssets>,然后在您的项目文件中包含以下代码。

有关更多信息,请参见https://github.com/nuget/home/issues/3891#issuecomment-459848847

<ItemGroup>
  <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
    <PrivateAssets>all</PrivateAssets>
  </ProjectReference>
</ItemGroup>

<!--
  The following solves the problem that 'dotnet pack' does not include the DLLs from referenced projects.
  See https://github.com/NuGet/Home/issues/3891 for a description of the problem
  and for newer versions / workarounds / built-in methods.
-->
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  <!-- include PDBs in the NuGet package -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
    <ItemGroup>
        <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'all'))" />
    </ItemGroup>
</Target>

5
问题在于,如果这些项目有NuGet引用,它们将被忽略,从而导致缺失程序集运行时错误。 - Michael
@Michael 有没有办法修复这个问题? - marsze

2

如果我理解正确,引用的项目程序集没有被包含在NuGet包中。

您可以尝试使用以下命令生成NuGet包:

nuget pack projectfile.csproj -IncludeReferencedProjects

这应该在Nuget中包含P2.dll。请参考此MSDN页面以获取更多详细信息。

希望这可以帮到你。


1
我刚刚更新了我的回答,解释了为什么这不适用 - 我没有使用 nuget pack(但是我仍然会给你点赞,因为这对于最初的问题来说是一个好答案 - 抱歉...) - RB.
问题在于NuGet打包不支持嵌入式视图,需要额外的工作来实现。 - Michael

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