Creare pacchetti per Xamarin con Visual Studio 2017 o 2019

Un pacchetto per Xamarin contiene codice che usa le API native in iOS, Android e Windows, a seconda del sistema operativo in fase di esecuzione. Anche se si tratta di un'operazione semplice, è preferibile consentire agli sviluppatori di utilizzare il pacchetto da una libreria .NET Standard o PCL tramite una superficie di attacco delle API comune.

In questa procedura dettagliata si usa Visual Studio 2017 o 2019 per creare un pacchetto di NuGet multipiattaforma che può essere usato nei progetti per dispositivi mobili in iOS, Android e Windows.

  1. Prerequisiti
  2. Creare la struttura del progetto e il codice di astrazione
  3. Scrivere il codice specifico della piattaforma
  4. Creare e aggiornare il file con estensione nuspec
  5. Creare un pacchetto per il componente
  6. Argomenti correlati

Prerequisiti

  1. Visual Studio 2017 o 2019 con piattaforma UWP (Universal Windows Platform) (UWP) e Xamarin. Installare l'edizione Community gratuitamente da visualstudio.com. È anche possibile usare le edizioni Professional ed Enterprise. Per includere gli strumenti UWP e Xamarin, selezionare un'installazione personalizzata e selezionare le opzioni appropriate.
  2. Interfaccia della riga di comando di NuGet. Scaricare la versione più recente di nuget.exe da nuget.org/downloads, salvandola in una posizione di propria scelta. Aggiungere quindi tale posizione alla variabile di ambiente PATH, se necessario.

Nota

Poiché nuget.exe è di per sé lo strumento dell'interfaccia della riga di comando e non un programma di installazione, assicurarsi di salvare il file scaricato dal browser invece di eseguirlo.

Creare la struttura del progetto e il codice di astrazione

  1. Scaricare ed eseguire l'estensione Modelli di plug-in .NET Standard multipiattaforma per Visual Studio. Questi modelli consentiranno di creare facilmente la struttura del progetto necessaria per questa procedura dettagliata.

  2. In Visual Studio 2017, File > Nuovo > Project, cercare Plugin, selezionare il modello Plug-in libreria .NET Standard multipiattaforma, modificare il nome in LoggingLibrary e fare clic su OK.

    New Blank App (Xamarin.Forms Portable) project in VS 2017

    In Visual Studio 2019 file > nuovo > Project cercare Plugin, selezionare il modello plug-in libreria .NET Standard multipiattaforma e fare clic su Avanti.

    New Blank App (Xamarin.Forms Portable) project in VS 2019

    Modificare il nome in LoggingLibrary e fare clic su Crea.

    New Blank App (Xamarin.Forms Portable) configuration in VS 2019

La soluzione risultante contiene due progetti condivisi, insieme a un'ampia gamma di progetti specifici della piattaforma:

  • Il ILoggingLibrary progetto, contenuto nel ILoggingLibrary.shared.cs file, definisce l'interfaccia pubblica (area di attacco API) del componente. dove viene definita l'interfaccia per la libreria.
  • L'altro progetto condiviso contiene codice in CrossLoggingLibrary.shared.cs che individua un'implementazione specifica della piattaforma dell'interfaccia astratta in fase di esecuzione. In genere non è necessario modificare questo file.
  • I progetti specifici della piattaforma, ad esempio LoggingLibrary.android.cs, contengono un'implementazione nativa dell'interfaccia nei rispettivi LoggingLibraryImplementation.cs file (VS 2017) o LoggingLibrary.<PLATFORM>.cs (VS 2019). dove si compila il codice della libreria.

Per impostazione predefinita, il file ILoggingLibrary.shared.cs del ILoggingLibrary progetto contiene una definizione di interfaccia, ma nessun metodo. Ai fini di questa procedura dettagliata, aggiungere un metodo Log come indicato di seguito:

using System;
using System.Collections.Generic;
using System.Text;

namespace Plugin.LoggingLibrary
{
    /// <summary>
    /// Interface for LoggingLibrary
    /// </summary>
    public interface ILoggingLibrary
    {
        /// <summary>
        /// Log a message
        /// </summary>
        void Log(string text);
    }
}

Scrivere il codice specifico della piattaforma

Per eseguire un'implementazione specifica della piattaforma dell'interfaccia ILoggingLibrary e dei relativi metodi, seguire questa procedura:

  1. Aprire il LoggingLibraryImplementation.cs file (VS 2017) o LoggingLibrary.<PLATFORM>.cs (VS 2019) di ogni progetto della piattaforma e aggiungere il codice necessario. Ad esempio (usando il Android progetto di piattaforma):

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Plugin.LoggingLibrary
    {
        /// <summary>
        /// Implementation for Feature
        /// </summary>
        public class LoggingLibraryImplementation : ILoggingLibrary
        {
            /// <summary>
            /// Log a message
            /// </summary>
            public void Log(string text)
            {
                throw new NotImplementedException("Called Log on Android");
            }
        }
    }
    
  2. Ripetere questa implementazione nei progetti per ogni piattaforma che si vuole supportare.

  3. Fare clic con il pulsante destro del mouse sulla soluzione e scegliere Compila soluzione per controllare il lavoro e generare gli elementi per cui in seguito verrà creato il pacchetto. Se vengono visualizzati errori su riferimenti mancanti, fare clic con il pulsante destro del mouse sulla soluzione, scegliere Ripristina pacchetti NuGet per installare le dipendenze ed eseguire di nuovo la compilazione.

Nota

Se si usa Visual Studio 2019, prima di selezionare Ripristina pacchetti NuGet e si tenta di ricompilare, è necessario modificare la versione di MSBuild.Sdk.Extras2.0.54 in .LoggingLibrary.csproj È possibile accedere a questo file solo facendo clic con il pulsante destro del mouse sul progetto (sotto la soluzione) e selezionando Unload Project, dopo il quale si fa clic con il pulsante destro del mouse sul progetto scaricato e scegliere Edit LoggingLibrary.csproj.

Nota

Per eseguire la compilazione per iOS, è necessario un Mac in rete connesso a Visual Studio, come descritto in Introduction to Xamarin.iOS for Visual Studio (Introduzione a Xamarin.iOS per Visual Studio). Se non è disponibile un Mac, cancellare il progetto iOS in Gestione configurazione (passaggio 3).

Creare e aggiornare il file con estensione nuspec

  1. Aprire un prompt dei comandi, passare alla cartella LoggingLibrary, di un livello inferiore rispetto alla posizione del file .sln, ed eseguire il comando spec di NuGet per creare il file Package.nuspec iniziale:

    nuget spec
    
  2. Rinominare questo file in LoggingLibrary.nuspec e aprirlo in un editor.

  3. Aggiornare il file 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>LoggingLibrary.YOUR_NAME</id>
        <version>1.0.0</version>
        <title>LoggingLibrary</title>
        <authors>YOUR_NAME</authors>
        <owners>YOUR_NAME</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Awesome application logging utility</description>
        <releaseNotes>First release</releaseNotes>
        <copyright>Copyright 2018</copyright>
        <tags>logger logging logs</tags>
        </metadata>
    </package>
    

Suggerimento

È possibile aggiungere alla versione del pacchetto il suffisso -alpha, -beta o -rc per contrassegnare il pacchetto come non definitivo. Per altre informazioni sulle versioni non definitive, vedere Versioni non definitive.

Aggiungere assembly di riferimento

Per includere gli assembly di riferimento specifici della piattaforma, aggiungere il codice seguente all'elemento <files> di LoggingLibrary.nuspec in modo appropriato alle piattaforme supportate:

<!-- Insert below <metadata> element -->
<files>
    <!-- Cross-platform reference assemblies -->
    <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.dll" />
    <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.xml" />
    <file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.dll" />
    <file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.xml" />

    <!-- iOS reference assemblies -->
    <file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.dll" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.dll" />
    <file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.xml" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.xml" />

    <!-- Android reference assemblies -->
    <file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.dll" target="lib\MonoAndroid10\Plugin.LoggingLibrary.dll" />
    <file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.xml" target="lib\MonoAndroid10\Plugin.LoggingLibrary.xml" />

    <!-- UWP reference assemblies -->
    <file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.dll" target="lib\UAP10\Plugin.LoggingLibrary.dll" />
    <file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.xml" target="lib\UAP10\Plugin.LoggingLibrary.xml" />
</files>

Nota

Per abbreviare i nomi dei file DLL e XML, fare clic con il pulsante destro del mouse su un determinato progetto, scegliere la scheda Libreria e modificare i nomi degli assembly.

Aggiungere le dipendenze

Se sono presenti dipendenze specifiche per le implementazioni native, usare l'elemento <dependencies> con gli elementi <group> per specificarle, ad esempio:

<!-- Insert within the <metadata> element -->
<dependencies>
    <group targetFramework="MonoAndroid">
        <!--MonoAndroid dependencies go here-->
    </group>
    <group targetFramework="Xamarin.iOS10">
        <!--Xamarin.iOS10 dependencies go here-->
    </group>
    <group targetFramework="uap">
        <!--uap dependencies go here-->
    </group>
</dependencies>

Il codice seguente, ad esempio, imposterà iTextSharp come dipendenza per la destinazione UAP:

<dependencies>
    <group targetFramework="uap">
        <dependency id="iTextSharp" version="5.5.9" />
    </group>
</dependencies>

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>LoggingLibrary.YOUR_NAME</id>
    <version>1.0.0</version>
    <title>LoggingLibrary</title>
    <authors>YOUR_NAME</authors>
    <owners>YOUR_NAME</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Awesome application logging utility</description>
    <releaseNotes>First release</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>logger logging logs</tags>
        <dependencies>
        <group targetFramework="MonoAndroid">
            <!--MonoAndroid dependencies go here-->
        </group>
        <group targetFramework="Xamarin.iOS10">
            <!--Xamarin.iOS10 dependencies go here-->
        </group>
        <group targetFramework="uap">
            <dependency id="iTextSharp" version="5.5.9" />
        </group>
    </dependencies>
    </metadata>
    <files>
        <!-- Cross-platform reference assemblies -->
        <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.dll" />
        <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.xml" />
        <file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.dll" />
        <file src="Plugin.LoggingLibrary.Abstractions\bin\Release\Plugin.LoggingLibrary.Abstractions.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.Abstractions.xml" />

        <!-- iOS reference assemblies -->
        <file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.dll" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.dll" />
        <file src="Plugin.LoggingLibrary.iOS\bin\Release\Plugin.LoggingLibrary.xml" target="lib\Xamarin.iOS10\Plugin.LoggingLibrary.xml" />

        <!-- Android reference assemblies -->
        <file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.dll" target="lib\MonoAndroid10\Plugin.LoggingLibrary.dll" />
        <file src="Plugin.LoggingLibrary.Android\bin\Release\Plugin.LoggingLibrary.xml" target="lib\MonoAndroid10\Plugin.LoggingLibrary.xml" />

        <!-- UWP reference assemblies -->
        <file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.dll" target="lib\UAP10\Plugin.LoggingLibrary.dll" />
        <file src="Plugin.LoggingLibrary.UWP\bin\Release\Plugin.LoggingLibrary.xml" target="lib\UAP10\Plugin.LoggingLibrary.xml" />
    </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 LoggingLibrary.nuspec

Verrà generato LoggingLibrary.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:

NuGet Package Explorer showing the LoggingLibrary package

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.