2017-07-07 2 views
4

Ich habe eine Visual Studio 2017-Lösung, die zwei Projekte enthält:MSBuild mehrere DLL in einem einzigen Paket NuGet

Foo.csproj 
Foo.Core.csproj 

Beide Projekte zielen mehrere Frameworks: net452;netstandard1.2

Foo.csproj umfasst einen Projektverweis Foo.Core.csproj zu:

<ItemGroup> 
    <ProjectReference Include="..\Foo.Core\Foo.Core.csproj" /> 
</ItemGroup> 

Wenn ich ein NuGet Paket für Foo.csproj erzeugen, mag ich die nupkg Datei beiden Baugruppen aufzunehmen.

Momentan ist das NuGet-Paket, das erstellt wird, Foo.dll und dann eine NuGet-Abhängigkeit von Foo.Core (das nicht vorhanden ist).

Wie kann ich ein einzelnes NuGet-Paket mit msbuild generieren, das beide Baugruppen enthält?

Als Referenz dies ist der Befehl, den ich zur Zeit benutzen (was nicht funktioniert, wie ich es will): aus dem Kasten heraus

msbuild /p:restore,pack Foo.csproj 

Antwort

8

Dies ist derzeit nicht direkt von NuGet unterstützt. Sie können this GitHub issue für Updates folgen.

Es gibt jedoch einige Möglichkeiten, ein solches NuGet-Paket zu erstellen.

  1. Verwenden Sie den „Nugetizer 3000“

Dies ist ein neu entwickeltes Werkzeug NuGet Pakete von Projekten und Arbeiten durch die Installation des NuGet.Build.Packaging nuget Paket zu erstellen. Auf der GitHub-Wiki-Seite finden Sie einige Dokumente dazu, aber da es ein sehr neues Projekt ist, gibt es noch nicht viel Dokumentation oder Community-Wissen (!) (Aber das Entwicklerteam ist sehr hilfreich, Sie könnten GitHub einreichen) Probleme, wenn Sie stecken bleiben).

  1. ein eigenes Ziel im Projekt (2.0.0 Werkzeuge/VS 2017 15.3+) Hinzufügen: Erstellen Sie ein Element in der csproj, dass die referenzierten Projekts Ausgabe DLL
enthalten wird

Dieser Ansatz ist sehr hacky, da er auf einem internen MSBuild-Element basiert, das von den Paketzielen verwendet wird. Es funktioniert durch die erste Markierung der <ProjectReference> nicht aus dem erstellten nuget Paket wie folgt referenziert werden:

<ProjectReference Include="..\libA\libA.csproj" PrivateAssets="All"/> 

Dann können Sie diese das erzeugte libA.dll im nuget Paket enthalten zum Projekt hinzufügen:

<PropertyGroup> 
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeP2PAssets</TargetsForTfmSpecificBuildOutput> 
</PropertyGroup> 
<Target Name="IncludeP2PAssets"> 
    <ItemGroup> 
    <BuildOutputInPackage Include="$(OutputPath)\testprivatelib.dll" /> 
    </ItemGroup> 
</Target> 

Beachten Sie, dass dies erfordert, dass Sie alle <PackageReference> Elemente des referenzierten Projekts zu dem Projekt hinzufügen, aus dem Sie das Paket generieren, da sie im generierten Paket fehlen würden, da Sie das transitive Referenzverhalten effektiv deaktiviert haben.

  1. eine .nuspec Datei benutzerdefinierte erstellen

Zum Zeitpunkt des Schreibens, ist dies wahrscheinlich die meisten „unterstützt“ Art und Weise, sondern auch das komplexeste. Mit NuGet können Sie die automatische Generierung der resultierenden Datei .nuspec und die automatische Sammlung von Dateien deaktivieren, indem Sie die Eigenschaft <NuspecFile> in Ihrem Projekt zusammen mit einer <NuspecProperties> -Eigenschaft festlegen, mit der Sie Ersatztoken zum Analysieren der .nuspec-Datei übergeben können.

Dies funktioniert durch die Projektdatei wie folgt ändern:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <TargetFramework>netstandard1.4</TargetFramework> 
    <NuspecFile>$(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec</NuspecFile> 
    </PropertyGroup> 
    <ItemGroup> 
    <ProjectReference Include="..\LibB\LibB.csproj" /> 
    </ItemGroup> 

    <Target Name="SetNuspecProperties" BeforeTargets="GenerateNuspec"> 
    <PropertyGroup> 
     <NuspecProperties>$(NuspecProperties);id=$(AssemblyName)</NuspecProperties> 
     <NuspecProperties>$(NuspecProperties);config=$(Configuration)</NuspecProperties> 
     <NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties> 
     <NuspecProperties>$(NuspecProperties);description=$(Description)</NuspecProperties> 
     <NuspecProperties>$(NuspecProperties);authors=$(Authors)</NuspecProperties> 
    </PropertyGroup> 
    </Target> 
</Project> 

Dies wird für eine .nuspec Datei sucht automatisch mit dem gleichen Namen wie das Projekt (somelib.csproj =>somelib.nuspec) und geben einige Eigenschaften zusammen zu. Die Eigenschaften werden in einem Ziel erstellt, um auf vollständig aufgelöste und vordefinierte Eigenschaften wie PackageVersion zugreifen zu können.

Die .nuspec Datei könnte wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> 
    <metadata> 
    <id>$id$</id> 
    <version>$version$</version> 
    <authors>$authors$</authors> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>$description$</description> 
    <dependencies> 
     <group targetFramework=".NETStandard1.4"> 
     <dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" /> 
     </group> 
    </dependencies> 
    </metadata> 
    <files> 
    <file src="bin\$config$\netstandard1.4\*.dll" target="lib\netstandard1.4\" /> 
    </files> 
</package> 

Beachten Sie, dass alle referenzierten NuGet Pakete als <dependency> Element in der .nuspec Datei, da diese automatisch aus den <PackageReference> Artikeln im Projekt generiert werden, nicht mehr müssen hinzufügen Datei. Weitere Informationen finden Sie unter NuSpec Reference.

Ich habe kürzlich eine example project on GitHub demonstrating the use of a custom .nuspec file für genau diesen Zweck erstellt.

Verwandte Themen