Erstellen Sie das NuGet-Paket automatisch, einschließlich der referenzierten Abhängigkeiten

83

Ich möchte ein lokales / internes NuGet-Repository ausführen . Ich glaube, ich habe herausgefunden, wie vorhandene NuGet-Pakete "wiederverwendet" werden können, indem ich sie mit NuGet in ein Dummy-Projekt aufgenommen und die Paketdatei gescannt habe, um meine lokal zwischengespeicherten .nupkgDateien abzurufen , aber ...

Wie erstellt man .nupkgaus einem Projekt ein Nuget-Paket ( ), das automatisch alle dll Abhängigkeiten enthält und nicht nur die über NuGet erfassten?

Speziell:

  1. Erstellen Sie eine Lösung
  2. Fügen Sie ein neues Projekt hinzu
  3. Verweise auf verschiedene .dllDateien / andere Projekte hinzufügen <- dies ist der fehlende Teil
  4. Fügen Sie NuGet-Pakete über den Paketmanager / cmdline / Whatever hinzu
  5. etwas schafft automatisch die.nupkg

Nach allem, was ich gefunden habe, solltest du Dinge wie tun

  • Bearbeiten Sie Ihre .csprojDatei manuell, <BuildPackage>true</BuildPackage>um Abhängigkeiten hinzuzufügen
  • Erstellen Sie manuell eine .nuspecDatei und listen Sie Ihre Abhängigkeiten manuell auf ( ähnlich? )
  • Führen Sie nuget packIhre .nuspecDatei manuell aus

Aber alles ist manuell, was dumm ist. Sogar die halbautomatischen Lösungen sind immer noch umständlich oder halb manuell:

Ich werde mich mit etwas zufrieden geben, das automatisch ein .nuspecManifest aus Projektreferenzen erstellt. Dann kann theoretisch + das Nuget-Build-Ereignis in ein Build-Projekt / Nuget-Paket zusammengefasst werden, was ich wirklich sehen möchte.

drzaus
quelle
Ich kam in dieser VS Erweiterung eyecatch.no/projects/nuget-package-template , die ich in schauen müssen ...
drzaus
3
Fünf Jahre später und Nuget 4.x Spec oder Pack können immer noch keine Abhängigkeiten bestimmen.
StingyJack
Gibt es ein Update für dieses Problem? Oder haben Sie immer noch diese Probleme?
Dominic Jonas
Ich habe dies vor einiger Zeit aufgegeben, aber schauen Sie sich NuProj an, wie in dieser Antwort angegeben
drzaus
Dieses Problem besteht weiterhin. :(
BrainSlugs83

Antworten:

75

Ihr Punkt 3 ( Verweise auf verschiedene DLL-Dateien / andere Projekte hinzufügen <- dies ist der fehlende Teil ) enthält zwei verschiedene Probleme: (1) Verweise auf verschiedene DLL-Dateien hinzufügen und (2) Verweise auf andere Projekte in hinzufügen die gleiche Lösung.

Nummer (2) hier hat seit NuGet 2.5 zusätzliche Unterstützung erhalten . Sie können eine Option hinzufügen, um beim Erstellen eines NuGet-Pakets für ein Projekt Verweise auf andere Projekte in dieselbe Lösung aufzunehmen:

nuget pack projectfile.csproj -IncludeReferencedProjects

Wenn projectfile.csprojauf andere Projekte in Ihrer Lösung verwiesen wird, die ebenfalls als NuGet-Pakete verfügbar gemacht werden, werden die NuGet-Pakete dieser Projekte als Abhängigkeiten hinzugefügt. Wenn auf Projekte in Ihrer Lösung verwiesen wird , die sich nicht als NuGet-Pakete verfügbar machen, werden deren DLLs in dieses NuGet-Paket aufgenommen.

Wenn Sie häufig feststellen, dass Sie Ihren Projekten häufig DLLs hinzufügen, die nicht als NuGet-Pakete verfügbar sind, können Sie mit diesen Dateien einfach Ihre eigenen (internen) NuGet-Pakete erstellen. Wenn Sie diese DLLs dann als NuGet-Paket anstelle der Dateien direkt hinzufügen, ist dieses NuGet-Paket eine Abhängigkeit vom NuGet-Paket Ihres Projekts.

julianisch
quelle
3
Seufzer Nr. 1 ist immer noch zu manuell für meinen Geschmack. Eigentlich versuche ich, mit diesen Dateien ein eigenes (internes) NuGet-Paket zu erstellen. Der springende Punkt dieser Frage ist, dass ich automatisch Nicht-NuGet-DLLs in ein NuGet-Paket rollen möchte. Nicht durchgehen und jede DLL manuell in einer auflisten .nuspec, was ich denke, ist das, was Sie vorschlagen?
Drzaus
Sie müssen nicht jede DLL separat angeben. Das wäre in der Tat viel Arbeit, wenn Sie viele davon haben. Wenn Sie Dateien auflisten, die eingeschlossen werden sollen, können Sie (rekursive) Platzhalter ( docs.nuget.org/docs/reference/… ) verwenden. Wenn Sie beispielsweise alle diese DLLs in einem separaten Ordner ablegen , ist dies ein Einzeiler das Einkaufszentrum.
Julian
Ah, jetzt komme ich dahin, wohin Sie gehen. Wenn ich also ein Wrapper-Projekt erstelle und Referenzen über das übliche "Rechtsklick-Projekt> Referenz hinzufügen" einbinde, kann ich eine nuspecerstellen, die alles im binVerzeichnis enthält (unter der Annahme meiner Referenzen) sind alle "lokal kopieren"), wird automatisch alles aufgenommen, was ich hinzugefügt habe. Scheint ein wenig hamfisted, würde aber wahrscheinlich funktionieren.
Drzaus
6
Es wird nicht automatisch alles aufnehmen, was sich in Ihrem bin-Verzeichnis befindet. Sie müssten es explizit angeben, etwa so:<file src="bin\release\*.dll" target="lib" />
Julian
2
Wenn die Projekte, auf die verwiesen wird, zufällig eine Nuspec-Datei haben, wird diese von nuget als Paket behandelt und NICHT in den lib-Ordner aufgenommen, sondern zu den
Paketabhängigkeiten hinzugefügt
5

Für andere Googler können Sie dies verwenden, wenn Sie die Datei NuGet.targets zum Ausführen von NuGet Pack verwenden:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>
John Gietzen
quelle
7
Klingt vielversprechend, aber nicht genug Informationen, um sie tatsächlich umzusetzen. Was ist diese NuGet.targets-Datei, von der Sie sprechen? Ich bin mit Build-Zieldateien im Allgemeinen vertraut, aber nicht mit diesem speziellen Anwendungsfall
bikeman868
2

Schau dir das an!

Die Lösung, die ich gefunden habe, ist eine Erweiterung für Visual Studio: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Sie fügen einfach ein neues Projekt mit dem Namen Nuget Package NuGet Package hinzu

Dann fügen Sie interessante Projekte zu Referenzen und BOOOM hinzu !! Alle Abhängigkeiten und Dateiverzeichnisse werden automatisch hinzugefügt. Wenn Sie NuSpec-Daten ändern möchten, klicken Sie direkt auf das Projekt und gehen Sie zu Eigenschaften. Ändern Sie dann die gewünschten Daten. Generiertes NuSpec und nupkg befinden sich im Ordner obj Ihres neuen Projekts. Ich hoffe, es hilft ;).

Przemysław Kamiński
quelle
1
Gibt es auch eine Lösung für VS2017?
Dominic Jonas
Dies funktioniert nicht, wenn die Pakete auf dem Build-Server generiert werden.
Michi-2142
Schade, dass dies veraltet ist. Wäre nützlich gewesen.
Joel
2

Ich habe einen gut geschriebenen Artikel zu diesem Thema gefunden. Ich habe das gleiche Problem mit bestimmten Paketen, die eine Hierarchie von Abhängigkeiten haben, und bis jetzt habe ich jedes als separates NuGet-Paket hochgeladen (was für eine Zeitverschwendung).

Ich habe gerade die hier gefundene Lösung getestet: https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

Nach Prüfung des NuGet-Pakets mit dem NuGet Package Explorer sind die DLLs vorhanden, die von Projekten erstellt werden, auf die verwiesen wird. Ich werde testen, indem ich dieses Paket tatsächlich an NuGet sende und es teste.

Hier ist meine Quelle für den Fall, dass sie für Sie hilfreich ist: https://github.com/jchristn/NuGetPackTest

Und das Test-NuGet-Paket: https://www.nuget.org/packages/NuGetPackTest/1.0.0

Die Lösung scheint gut zu funktionieren. Ich weiß nicht, wie es aussehen wird, wenn es Schichten von Referenzen gibt. Ich bin sicher, es könnte sehr haarig und sehr schnell werden.

Geben Sie hier die Bildbeschreibung ein

.csproj aus der NuGetPackTest-Bibliothek, die auf das Projekt TestLibrary verweist (Teile wurden der Kürze halber entfernt)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>
joelc
quelle
1
Dies löste mein Problem sofort. Ich habe die Anweisungen wie im Link erwähnt befolgt und es hat funktioniert. Schön, dass das Wesentliche auch in Ihrer Antwort hinzugefügt wurde.
Jabez