问题
I have 3 class library projects (all .NET Standard 2.0) that are all in the same solution. I want to package them into a single nuget and use the code in other repos.
However, when I package them into a NuGet package two of them are added as a nuget dependency to the third one, instead of being directly referenced as dlls.
Here is an example of my setup.
The 3 projects - A.csproj, B.csproj, C.csproj (All Class Libraries, All .NET Standard 2.0)
A is set as a startup project and references B and C
B has a reference to C
C has no references to the other two (it only references 2 3rd party nugets)
When I package my solution into a nuget package, the nuspec file has a <dependencies> group that has all nuget references from my project (correct) along with 2 dependencies for projects B and C with versions 1.0.0 (incorrect)
I am not sure what is causing nuget to behave like this (I imagine its by design) but I cannot wrap my head around to fix the issue.
What I want is for projects B and C to be packaged as DLLs to project A and not as seprate packages.
回答1:
I am not sure what is causing nuget to behave like this (I imagine its by design) but I cannot wrap my head around to fix the issue.
Yes, this behave is by design. When we pack the .net core/.NET Standard, the PrivateAssets metadata tags control whether dependency assets flow to the parent project. If the value is set to All, this dependency assets would not flow to the parent project. In other words, projects B and C will not added to the package as dependencies.
Check Controlling dependency assets for more info.
What I want is for projects B and C to be packaged as DLLs to project A and not as seprate packages.
Just like what I said in the first question, we could use PrivateAssets metadata tags control whether dependency assets flow to the parent project, but the PrivateAssets metadata tags does not package project B and C as project A DLLs.
If you want projects B and C to be packaged as DLLs to project A and not as separate packages, we need to use .nuspec file to include them manually.
The .nuspec like:
<?xml version="1.0"?>
<package >
<metadata>
<id>TestDemo</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>TestDemo</description>
<releaseNotes>Summary of changes made in this release of the package. </releaseNotes>
<copyright>Copyright 2017</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="bin\debug\projectA.dll" target="lib\.netstand2.0" />
<file src="<Path>\projectB.dll" target="lib\.netstand2.0" />
<file src="<Path>\projectC.dll" target="lib\.netstand2.0" />
</files>
</package>
Check this thread for more details.
回答2:
You have to update the version for dependencies in .nuspec manually/ or through some pre/post build command/script. If you need to do this for a lot of projects then I'll suggest to write a script and run on pre/post build event.
The .nuspec can not detect the version for dependencies itself.
回答3:
It looks like you want to generate the DLLs to B and C, then copy them into a resource folder for A which is referenced in A's nuspec file. That is, you are only packaging A, which happens to include DLLs for B and C, so the build of B and C, and adding of there DLLs to A, should happen separately before the packaging of A.
来源:https://stackoverflow.com/questions/52814421/nuget-packages-project-dependencies-as-nuget-dependencies