Project generates a nuget package that depends on another project that does not create a nuget package

£可爱£侵袭症+ 提交于 2019-12-07 16:54:05

问题


If I have a project (P1) that builds a nuget package, and I make it depend on a project (P2) that doesn't build a nuget package, the generated package will still reference P2 as a nuget package.

Steps to reproduce

  • Create a solution with 2 C# projects (P1 and P2)
  • Make P1 depend on P2.
  • Add the following line to P1.csproj (to make it build a nuget package)

    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

  • Build the solution
  • Open the generated P1.nupkg in, e.g., NuGet Package Explorer

Note that the NuGet package depends on another NuGet package called P2. However, that package does not exist, and will never exist, as I have not told the P2 project to build a nuget package.

Question

How do I force P2.dll to be included in P1.nupkg's lib folder? Ideally it will force it only for references that don't create a nuget package themselves.

Other questions

  • Package .NET Standard library as Nuget package and include all project dependencies / references is related, but assumes the use of nuget pack. I am using dotnet build or Visual Studio to build the nuget package, so doesn't apply.
  • This GitHub query is pretty much the same as my issue.

回答1:


One workaround is to mark any assets you don't want to include as <PrivateAssets>all</PrivateAssets>, and then include the below code in your project file.

See https://github.com/nuget/home/issues/3891#issuecomment-459848847 for more information

<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>



回答2:


If I understood correctly, the referenced project assemblies are not getting included in the nuget package.

You can try below command while generating nuget package by using below command:

nuget pack projectfile.csproj -IncludeReferencedProjects

This should include P2.dll in the nuget. Refer this MSDN page for more details.

Hope this helps.



来源:https://stackoverflow.com/questions/55164169/project-generates-a-nuget-package-that-depends-on-another-project-that-does-not

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!