2016-01-05 8 views
7

Come si impacchetta una libreria di piattaforma Windows universale che dipende dagli SDK di estensione di Visual Studio come Microsoft Player Framework?Come impacchettare una libreria .NET destinata alla Universal Windows Platform e dipende dagli SDK di estensione di Visual Studio?

In particolare, desidero che gli utenti della mia libreria siano in grado di utilizzarlo immediatamente dopo aver premuto il pulsante Installa in NuGet, senza dover aggiungere manualmente gli SDK dell'estensione ai loro progetti. Supponendo, naturalmente, che vengano installati gli SDK di estensione appropriati.

Si tratta di una serie di domande e risposte che documentano le mie scoperte sul tema del pacchetto di authoring moderna NuGet, concentrandosi in particolare sulle modifiche introdotte con NuGet 3. Si può anche essere interessati a alcune domande correlate:

+0

nota a margine: le coppie di domande/risposte sono state notate e causate [questa meta domanda] (http://meta.stackoverflow.com/questions/314088/posting-series-questions-and-answering-them-yourself) – rene

risposta

5

Questa risposta costruisce sulla principles of .NET Framework library packaging e principles of Universal Windows Platform library packaging. Leggi le risposte collegate per capire meglio quanto segue.

Quando si fa riferimento direttamente un Visual Studio SDK estensione in un progetto, il seguente frammento è incluso nel file Csproj:

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

NuGet offre funzionalità che consente un'azione equivalente da eseguire quando si installa un NuGet pacchetto. La prima cosa che devi fare è creare nel tuo progetto un file .targets (ad es. MyLibraryUsingExtensionSdk.targets) che contenga l'XML pertinente da aggiungere al progetto in cui è installata la tua libreria. Dovrai copiare l'elemento <SDKReference> pertinente dal file .csproj della tua libreria e includere anche eventuali elementi padre, creando un documento XML completo che può essere unito.

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

Imposta l'azione di costruzione di questo file su Nessuno, per evitare che venga inutilmente toccata dal processo di creazione.

Includendo questo file .targets nella posizione appropriata nella struttura del pacchetto NuGet, esso verrà automaticamente unito a runtime in progetti che fanno uso della libreria. Si vuole raggiungere la seguente struttura del pacchetto:

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

È possibile creare un tale pacchetto utilizzando il seguente modello .nuspec:

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

noti che Visual Studio richiederà una ricarica soluzione per riconoscere pienamente l'estensione SDK dopo l'installazione di un pacchetto NuGet. Le build funzioneranno immediatamente senza problemi ma IntelliSense non rileverà la nuova estensione SDK fino a quando non verrà ricaricata.

Sfortunatamente, questo approccio richiede di eseguire l'hardcode del numero di versione dell'SDK dell'estensione, che può essere problematico. Al momento della scrittura, non conosco alcun modo per specificare un intervallo di versioni o un riferimento indipendente dalla versione.

Ricordarsi di creare la soluzione utilizzando la configurazione di rilascio prima di creare il pacchetto NuGet.

Una libreria di esempio e i relativi file di imballaggio sono available on GitHub. La soluzione corrispondente a questa risposta è UwpLibraryDependingOnExtensionSdks.

Problemi correlati