12
UNLEASH THE POWER OF CODE REUSE Creating Plugins For Xamarin Yu Guan | Microsoft MVP

Unleash the power of code reuse - creating plugins for Xamarin

  • Upload
    yu-guan

  • View
    135

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Unleash the power of code reuse - creating plugins for Xamarin

UNLEASH THE POWER OF CODE REUSE

Creating Plugins For Xamarin

Yu Guan | Microsoft MVP

Page 2: Unleash the power of code reuse - creating plugins for Xamarin

Meet Yu Guan | @askguanyu

twitter.com/askguanyulinkedin.com/in/yuguanaskguanyu.wordpress.comdevlib.codeplex.com

Microsoft MVPSpeaker, Blogger, Hacker, Coder, Maker, GamerAzure, IoT, Cross-platform Apps, GIS, Services

Page 3: Unleash the power of code reuse - creating plugins for Xamarin

WHAT IS A PLUGIN FOR XAMARIN? Abstract platform specific functionality API Small Cross-platform Minimal-to-no dependencies Accessed via PCL or Shared Projects

Page 4: Unleash the power of code reuse - creating plugins for Xamarin

WALKTHROUGH

Get Visual Studio Extensions - Plugin For Xamarin TemplatesCreate Plugin For Xamarin Templates projects

Implement your pluginAdd nuspec file

Nuget packTest (optional)

Nuget pushSync to GitHub (optional)

Page 5: Unleash the power of code reuse - creating plugins for Xamarin

PLUGIN FOR XAMARIN TEMPLATES https://visualstudiogallery.msdn.microsoft.com/afead421-3fbf-489a

-a4e8-4a244ecdbb1e

Page 6: Unleash the power of code reuse - creating plugins for Xamarin

CREATE PROJECTS

Page 7: Unleash the power of code reuse - creating plugins for Xamarin

IMPLEMENT YOUR PLUGIN

/// <summary>/// Interface for MyPlugin1/// </summary>public interface IMyPlugin1{ bool IsConnected { get; set; }

void PlaySound();

string GetDeviceInfo();}

/// <summary>/// Implementation for MyPlugin1/// </summary>public class MyPlugin1Implementation : IMyPlugin1{ public bool IsConnected { get { throw new NotImplementedException(); }

set { throw new NotImplementedException(); } }

public void PlaySound() { throw new NotImplementedException(); }

public string GetDeviceInfo() { throw new NotImplementedException(); }}

Page 8: Unleash the power of code reuse - creating plugins for Xamarin

ADD NUSPEC FILE<?xml version="1.0" encoding="utf-8"?><package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata minClientVersion="2.8.3"> <id>Plugin.MyPlugin1</id> <version>1.0.0</version> <title>MyPlugin1 Plugin for Xamarin and Windows</title> <authors>Your Name</authors> <owners>Your Name</owners> <licenseUrl/> <projectUrl/> <!--Default Icon, a template can be found: https://raw.githubusercontent.com/jamesmontemagno/Xamarin-Templates/master/Plugins-Templates/icons/plugin_icon.png--> <iconUrl>https://raw.githubusercontent.com/jamesmontemagno/Xamarin-Templates/master/Plugins-Templates/icons/plugin_icon_nuget.png</iconUrl>

<requireLicenseAcceptance>false</requireLicenseAcceptance> <description> Long description for your plugin. </description> <summary>Short description for your plugin.</summary> <tags>xamarin, pcl, xam.pcl, plugin, plugin for xamarin, windows phone, winphone, wp8, winrt, android, xamarin.forms, ios</tags> <dependencies> <group targetFramework="net"> </group> <group targetFramework="win"> </group> <group targetFramework="wp"> </group> <group targetFramework="wpa"> </group> <group targetFramework="MonoAndroid"> </group> <group targetFramework="Xamarin.iOS10"> </group> <group targetFramework="Xamarin.Mac20"> </group> <group targetFramework="portable-net45+win+wpa81+wp80"> </group> <group targetFramework="uap"> </group> <group targetFramework="dotnet"> </group> </dependencies> </metadata> <files> <!--Core--> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.dll" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.xml" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.pdb" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.MyPlugin1.Abstractions.pdb" />

<!--dotnet--> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.dll" target="lib\dotnet\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.xml" target="lib\dotnet\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1\bin\Release\Plugin.MyPlugin1.pdb" target="lib\dotnet\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\dotnet\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\dotnet\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\dotnet\Plugin.MyPlugin1.Abstractions.pdb" />

<!--Win Phone Silverlight--> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone8\bin\Release\Plugin.MyPlugin1.dll" target="lib\wp8\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone8\bin\Release\Plugin.MyPlugin1.xml" target="lib\wp8\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone8\bin\Release\Plugin.MyPlugin1.pdb" target="lib\wp8\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\wp8\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\wp8\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\wp8\Plugin.MyPlugin1.Abstractions.pdb" />

<!--Win Phone 81--> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone81\bin\Release\Plugin.MyPlugin1.dll" target="lib\wpa81\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone81\bin\Release\Plugin.MyPlugin1.xml" target="lib\wpa81\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsPhone81\bin\Release\Plugin.MyPlugin1.pdb" target="lib\wpa81\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\wpa81\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\wpa81\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\wpa81\Plugin.MyPlugin1.Abstractions.pdb" />

<!--WinStore--> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsStore\bin\Release\Plugin.MyPlugin1.dll" target="lib\win8\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsStore\bin\Release\Plugin.MyPlugin1.xml" target="lib\win8\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.WindowsStore\bin\Release\Plugin.MyPlugin1.pdb" target="lib\win8\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\win8\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\win8\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\win8\Plugin.MyPlugin1.Abstractions.pdb" />

<!--Xamarin.Android--> <file src="MyPlugin1\Plugin.MyPlugin1.Android\bin\Release\Plugin.MyPlugin1.dll" target="lib\MonoAndroid10\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Android\bin\Release\Plugin.MyPlugin1.xml" target="lib\MonoAndroid10\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Android\bin\Release\Plugin.MyPlugin1.pdb" target="lib\MonoAndroid10\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\MonoAndroid10\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\MonoAndroid10\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\MonoAndroid10\Plugin.MyPlugin1.Abstractions.pdb" />

<!--Xamarin.iOS--> <file src="MyPlugin1\Plugin.MyPlugin1.iOS\bin\iPhone\Release\Plugin.MyPlugin1.dll" target="lib\Xamarin.iOS10\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.iOS\bin\iPhone\Release\Plugin.MyPlugin1.xml" target="lib\Xamarin.iOS10\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\Xamarin.iOS10\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\Xamarin.iOS10\Plugin.MyPlugin1.Abstractions.xml" />

<!--uap--> <file src="MyPlugin1\Plugin.MyPlugin1.UWP\bin\Release\Plugin.MyPlugin1.dll" target="lib\UAP10\Plugin.MyPlugin1.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.UWP\bin\Release\Plugin.MyPlugin1.xml" target="lib\UAP10\Plugin.MyPlugin1.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.UWP\bin\Release\Plugin.MyPlugin1.pdb" target="lib\UAP10\Plugin.MyPlugin1.pdb" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\UAP10\Plugin.MyPlugin1.Abstractions.dll" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\UAP10\Plugin.MyPlugin1.Abstractions.xml" /> <file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.pdb" target="lib\UAP10\Plugin.MyPlugin1.Abstractions.pdb" />

<!--Xamarin.Mac<file src="MyPlugin1\Plugin.MyPlugin1.Mac\bin\iPhone\Release\Plugin.MyPlugin1.dll" target="lib\Xamarin.Mac20\Plugin.MyPlugin1.dll" /><file src="MyPlugin1\Plugin.MyPlugin1.Mac\bin\iPhone\Release\Plugin.MyPlugin1.xml" target="lib\Xamarin.Mac20\Plugin.MyPlugin1.xml" /><file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.dll" target="lib\Xamarin.Mac20\Plugin.MyPlugin1.Abstractions.dll" /><file src="MyPlugin1\Plugin.MyPlugin1.Abstractions\bin\Release\Plugin.MyPlugin1.Abstractions.xml" target="lib\Xamarin.Mac20\Plugin.MyPlugin1.Abstractions.xml" />

--> </files></package>

Page 9: Unleash the power of code reuse - creating plugins for Xamarin

PACKAGING AND PUBLISHING NUGET PACKAGE https://docs.nuget.org/Create/Creating-and-Publishing-a-Package nuget.exe update –self nuget.exe setApiKey “your key” nuget.exe pack YourPackage.nuspec nuget.exe push YourPackage.nupkg -Source

https://www.nuget.org/api/v2/package

Page 10: Unleash the power of code reuse - creating plugins for Xamarin

GitHub

Page 11: Unleash the power of code reuse - creating plugins for Xamarin

TIME TO CODE

Page 12: Unleash the power of code reuse - creating plugins for Xamarin

Thank You!