Creare pacchetti UWP
La piattaforma UWP (Universal Windows Platform) è una piattaforma applicativa comune per ogni dispositivo che esegue Windows 10. In questo modello le app UWP possono chiamare sia le API WinRT comuni a tutti i dispositivi che le API (incluse Win32 e .NET) specifiche della famiglia di dispositivi su cui l'app è in esecuzione.
Questa procedura dettagliata descrive come creare un pacchetto NuGet con un componente UWP nativo (incluso un controllo XAML) che può essere usato in progetti sia gestiti che nativi.
Prerequisiti
Visual Studio 2017 o Visual Studio 2015. Installare l'edizione 2017 Community gratuitamente da visualstudio.com. È anche possibile usare le edizioni Professional ed Enterprise.
Interfaccia della riga di comando di NuGet. Scaricare la versione più recente
nuget.exe
da nuget.org/downloads, salvandola in una posizione di propria scelta (il download include direttamente il file.exe
). Aggiungere quindi tale posizione alla variabile di ambiente PATH, se necessario.
Creare un componente Windows Runtime UWP
In Visual Studio scegliere File > nuovo > Project, espandere il nodo Visual C++ > Windows > Universale, selezionare il modello Windows Runtime Component (Universal Windows), modificare il nome in ImageEnhancer e fare clic su OK. Accettare i valori predefiniti per Versione di destinazione e Versione minima quando richiesto.
Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, scegliere Aggiungi > nuovo elemento, fare clic sul nodo XAML di Visual C++>, selezionare Controllo basato su modelli, modificare il nome in AwesomeImageControl.cpp e fare clic su Aggiungi:
Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Proprietà. Nella pagina Proprietà espandere Proprietà > di configurazione C/C++ e fare clic su File di output. Nel riquadro a destra impostare il valore di Genera file di documentazione XML su Sì:
Fare clic con il pulsante destro del mouse sulla soluzione, scegliere Compilazione batch e selezionare le tre caselle Debug nella finestra di dialogo, come illustrato sotto. Ciò assicura che, quando si esegue una compilazione, venga generato un set completo di elementi per ogni sistema di destinazione supportato da Windows.
Nella finestra di dialogo Compilazione batch fare clic su Compila per verificare il progetto e creare i file di output necessari per il pacchetto NuGet.
Nota
In questa procedura dettagliata vengono usati gli elementi Debug per il pacchetto. Per il pacchetto non di debug, selezionare invece le opzioni Versione nella finestra di dialogo Compilazione batch e fare riferimento alle cartelle Versione risultanti nei passaggi che seguono.
Creare e aggiornare il file con estensione nuspec
Per creare il file .nuspec
iniziale, eseguire i tre passaggi elencati sotto. Le sezioni che seguono forniscono quindi indicazioni dettagliate sugli altri aggiornamenti necessari.
Aprire un prompt dei comandi e passare alla cartella contenente
ImageEnhancer.vcxproj
, che sarà una sottocartella sotto la posizione in cui si trova il file della soluzione.Eseguire il comando
spec
di NuGet per generareImageEnhancer.nuspec
. Il nome del file viene ricavato dal nome del file.vcxproj
:nuget spec
Aprire
ImageEnhancer.nuspec
in un editor e aggiornarlo in modo che corrisponda a quanto segue, sostituendo YOUR_NAME con un valore appropriato. Il valore<id>
, in particolare, deve essere univoco in nuget.org. Vedere le convenzioni di denominazione descritte in Creazione di un pacchetto. Tenere inoltre presente che è anche necessario aggiornare i tag relativi all'autore e alla descrizione o si verifica un errore durante il passaggio di creazione del pacchetto.<?xml version="1.0"?> <package > <metadata> <id>ImageEnhancer.YOUR_NAME</id> <version>1.0.0</version> <title>ImageEnhancer</title> <authors>YOUR_NAME</authors> <owners>YOUR_NAME</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Awesome Image Enhancer</description> <releaseNotes>First release</releaseNotes> <copyright>Copyright 2016</copyright> <tags>image enhancer imageenhancer</tags> </metadata> </package>
Nota
Per i pacchetti compilati per uso pubblico, prestare particolare attenzione all'elemento <tags>
, perché questi tag consentono ad altri utenti di trovare il pacchetto e di conoscerne le funzioni.
Aggiunta di metadati Windows al pacchetto
Un componente Windows Runtime richiede metadati che descrivono tutti i tipi disponibili pubblicamente, per consentire ad altre app e librerie di utilizzare il componente. Questi metadati sono contenuti in un file con estensione winmd, che viene creato quando si compila il progetto e deve essere incluso nel pacchetto NuGet insieme a un file XML con dati IntelliSense che viene compilato nello stesso momento.
Aggiungere il nodo <files>
seguente al file .nuspec
:
<package>
<metadata>
...
</metadata>
<files>
<!-- WinMd and IntelliSense files -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
</files>
</package>
Aggiunta di contenuto XAML
Per includere un controllo XAML con il componente, è necessario aggiungere il file XAML contenente il modello predefinito per il controllo (generato dal modello di progetto). Anche questo va inserito nella sezione <files>
:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
</files>
</package>
Aggiunta di librerie di implementazione native
Nel componente la logica principale del tipo ImageEnhancer si trova nel codice nativo, che è contenuto nei diversi assembly ImageEnhancer.dll
generati per ogni runtime di destinazione (ARM, x86 e x64). Per includerli nel pacchetto, farvi riferimento nella sezione <files>
insieme ai file di risorse PRI associati:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
</files>
</package>
Aggiunta del file con estensione targets
Per i progetti C++ e JavaScript che potrebbero utilizzare il pacchetto NuGet è poi necessario un file con estensione targets per identificare i file di assembly e winmd necessari. I progetti C# e Visual Basic eseguono questa operazione automaticamente. Creare questo file copiando il testo seguente in ImageEnhancer.targets
e salvarlo nella stessa cartella del .nuspec
file. Nota: questo file .targets
deve avere lo stesso nome dell'ID di pacchetto (ad esempio, l'elemento <Id>
nel file .nupspec
):
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
<ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
</PropertyGroup>
<ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
<Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
<Implementation>ImageEnhancer.dll</Implementation>
</Reference>
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
</ItemGroup>
</Project>
Fare quindi riferimento a ImageEnhancer.targets
nel file .nuspec
:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
File con estensione nuspec finale
Il file .nuspec
finale sarà simile al seguente, dove YOUR_NAME deve essere sostituito con un valore appropriato:
<?xml version="1.0"?>
<package >
<metadata>
<id>ImageEnhancer.YOUR_NAME</id>
<version>1.0.0</version>
<title>ImageEnhancer</title>
<authors>YOUR_NAME</authors>
<owners>YOUR_NAME</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Awesome Image Enhancer</description>
<releaseNotes>First Release</releaseNotes>
<copyright>Copyright 2016</copyright>
<tags>image enhancer imageenhancer</tags>
</metadata>
<files>
<!-- WinMd and IntelliSense -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
Creare un pacchetto per il componente
Dopo avere completato il file .nuspec
che fa riferimento a tutti i file da includere nel pacchetto, è possibile eseguire il comando pack
:
nuget pack ImageEnhancer.nuspec
Questo codice genera ImageEnhancer.YOUR_NAME.1.0.0.nupkg
. Aprendo il file in uno strumento come NuGet Package Explorer ed espandendo tutti i nodi, vengono visualizzati i contenuti seguenti:
Suggerimento
Un file .nupkg
è solo un file ZIP con un'estensione diversa. È anche possibile esaminare i contenuti del pacchetto, modificando .nupkg
in .zip
, ma si ricordi di ripristinare l'estensione prima di caricare un pacchetto in nuget.org.
Per rendere disponibile il pacchetto ad altri sviluppatori, seguire le istruzioni riportate in Pubblicare un pacchetto.