2016-01-05 14 views
7

Wie packe ich eine Universal Windows Platform-Bibliothek, die von Visual Studio-Erweiterungs-SDKs wie dem Microsoft Player Framework abhängt?Wie packt man eine .NET-Bibliothek, die auf die Universal Windows-Plattform abzielt und von Visual Studio-Erweiterungs-SDKs abhängig ist?

Insbesondere möchte ich Benutzer meiner Bibliothek in der Lage sein, es sofort nach dem Drücken der Schaltfläche Installieren in NuGet zu verwenden, ohne die Erweiterung SDKs zu ihren Projekten manuell hinzufügen zu müssen. Angenommen natürlich, dass die entsprechenden Erweiterungs-SDKs tatsächlich installiert sind.

Dies ist eine Reihe von Fragen und Antworten, die meine Erkenntnisse über das Thema der modernen NuGet Paket Authoring dokumentieren, wobei der Schwerpunkt vor allem auf die eingeführten Änderungen mit NuGet 3. Sie könnten auch interessiert sein in einigen verwandten Fragen:

+0

Randnotiz: Ihre Frage/Antwort-Paare wurden bemerkt und verursacht [diese Meta-Frage] (http://meta.stackoverflow.com/questions/314088/posting-series-questions-and-answering-them-yourself) – rene

Antwort

5

Diese Antwort baut auf die principles of .NET Framework library packaging und die principles of Universal Windows Platform library packaging. Lesen Sie zuerst die verknüpften Antworten, um das Folgende besser zu verstehen.

Wenn Sie direkt einen Visual Studio-Erweiterung SDK in einem Projekt, das folgende Snippet Referenz in der CSPROJ-Datei enthalten:

<SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2"> 
    <Name>Microsoft Player Framework</Name> 
</SDKReference> 

NuGet bietet Funktionalität, die eine äquivalente Wirkung ermöglicht durchgeführt werden, wenn ein NuGet Installation Paket. Als Erstes müssen Sie in Ihrem Projekt eine .targets-Datei erstellen (z. B. MyLibraryUsingExtensionSdk.targets), die die relevante XML-Datei enthält, die dem Projekt hinzugefügt werden soll, in dem Ihre Bibliothek installiert ist. Sie möchten das relevante Element <SDKReference> aus der .csproj-Datei Ihrer Bibliothek kopieren und auch alle übergeordneten Elemente einschließen, um ein vollständiges XML-Dokument zu erstellen, das zusammengeführt werden kann.

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <SDKReference Include="Microsoft.PlayerFramework.Xaml.UWP, Version=3.0.0.2"> 
      <Name>Microsoft Player Framework</Name> 
     </SDKReference> 
    </ItemGroup> 
</Project> 

Legen Sie die Build-Aktion dieser Datei auf None fest, um zu vermeiden, dass sie vom Buildprozess unnötig berührt wird.

Wenn Sie diese .targets-Datei an der entsprechenden Position in der NuGet-Paketstruktur einschließen, wird sie automatisch zur Laufzeit in Projekten zusammengeführt, die Ihre Bibliothek verwenden. Sie möchten die folgende Paketstruktur erreichen:

+---build 
| \---uap10.0 
|   MyLibraryUsingExtensionSdk.targets 
| 
\---lib 
    \---uap10.0 
     | MyLibraryUsingExtensionSdk.dll 
     | MyLibraryUsingExtensionSdk.pdb 
     | MyLibraryUsingExtensionSdk.pri 
     | MyLibraryUsingExtensionSdk.XML 
     | 
     \---MyLibraryUsingExtensionSdk 
       ExampleControl.xaml 
       MyLibraryUsingExtensionSdk.xr.xml 

Sie erstellen ein solches Paket die folgenden .nuspec Vorlage kann:

<?xml version="1.0"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata minClientVersion="3.2"> 
     <id>Example.MyLibraryUsingExtensionSdk</id> 
     <version>1.0.0</version> 
     <authors>Firstname Lastname</authors> 
     <description>Example of a simple UWP library that depends on an extension SDK.</description> 
    </metadata> 
    <files> 
     <!-- Causes referencing this NuGet package to also automatically reference the relevant extension SDKs. --> 
     <file src="MyLibraryUsingExtensionSdk.targets" target="build\uap10.0\MyLibraryUsingExtensionSdk.targets" /> 

     <file src="..\bin\Release\MyLibraryUsingExtensionSdk**" target="lib\uap10.0" /> 
    </files> 
</package> 

Beachten Sie, dass Visual Studio eine Lösung Reload benötigen vollständig um die Erweiterung zu erkennen SDK nach der Installation eines solchen NuGet-Pakets. Builds funktionieren sofort ohne Probleme, aber IntelliSense wird das neue Erweiterungs-SDK erst nach einem erneuten Laden übernehmen.

Leider erfordert dieser Ansatz, dass Sie die Versionsnummer des Extension SDK fest codieren, was problematisch sein kann. Zum Zeitpunkt des Schreibens weiß ich keine Möglichkeit, eine Reihe von Versionen oder eine versionsunabhängige Referenz anzugeben.

Denken Sie daran, Ihre Lösung mit der Release-Konfiguration zu erstellen, bevor Sie das NuGet-Paket erstellen.

Eine Beispielbibliothek und die relevanten Verpackungsdateien sind available on GitHub. Die Lösung, die dieser Antwort entspricht, ist UwpLibraryDependingOnExtensionSdks.