项目生成一个依赖于另一个不创建Nuget软件包的项目的Nuget软件包



如果我有一个构建nuget软件包的项目(p1),并且我将其依赖于不构建nuget软件包的项目(p2),则生成的软件包仍将参考p2 作为nuget软件包

复制步骤

  • 使用2 C#项目(P1和P2)创建解决方案
  • 使P1取决于P2。
  • 将以下行添加到p1.csproj(使其构建nuget软件包)

    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

  • 构建解决方案
  • 打开生成的p1.nupkg in,例如,nuget package explorer

请注意,Nuget软件包取决于另一个称为P2的Nuget软件包。但是,该软件包不存在,并且永远不会存在,因为我没有告诉P2项目来构建Nuget软件包。

问题

如何强制p2.dll包含在p1.nupkg的lib文件夹中?理想情况下,它将仅用于不创建nuget软件包的参考文献。

其他问题

  • 软件包.NET标准库作为Nuget软件包,并将所有项目依赖关系/参考均相关,但假设使用nuget pack。我正在使用dotnet build或Visual Studio来构建Nuget软件包,因此不适用。
  • 此github查询与我的问题几乎相同。

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

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

<ItemGroup>
  <ProjectReference Include="..ClassLibrary1ClassLibrary1.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>

如果我正确理解,则引用的项目组件未包含在Nuget软件包中。

您可以使用以下命令在生成Nuget软件包时尝试以下命令:

nuget pack projectfile.csproj -IncludeReferencedProjects

这应该包括nuget中的p2.dll。请参阅此MSDN页面以获取更多详细信息。

希望这会有所帮助。

相关内容

最新更新