ClockExtension
Sample¶The ClockExtension
sample walks you through how to create a simple .NET Interactive extension and then package it using NuGet.
If you opened this notebook so that its working directory is in the ClockExtension
project directory, then the following cell will work. Otherwise, you should first switch your working directory to the directory containing this notebook.
# 1. Build the project
dotnet build ClockExtension
# Clear any older versions of this extension package from your NuGet cache
rm ~/.nuget/packages/ClockExtension -Force -Recurse -ErrorAction Ignore
# Pack up the NuGet package.
dotnet pack ClockExtension /p:PackageVersion=1.0.0
# 3. Check that the package is there
Get-ChildItem -Recurse ClockExtension*.nupkg
MSBuild version 17.8.3+195e7f5a3 for .NET Determining projects to restore... All projects are up-to-date for restore. ClockExtension -> C:\dev\interactive\samples\extensions\ClockExtension\bin\Debug\net8.0\ClockExtension.dll Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:02.68 MSBuild version 17.8.3+195e7f5a3 for .NET Determining projects to restore... All projects are up-to-date for restore. ClockExtension -> C:\dev\interactive\samples\extensions\ClockExtension\bin\Release\net8.0\ClockExtension.dll C:\Program Files\dotnet\sdk\8.0.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): warning NU5104: A stable release of a package should not have a prerelease dependency. Either modify the version spec of dependency "microsoft.dotnet.interactive [1.0.0-beta.23562.1, )" or update the version field in the nuspec. [C:\dev\interactive\samples\extensions\ClockExtension\ClockExtension.csproj] C:\Program Files\dotnet\sdk\8.0.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): warning NU5104: A stable release of a package should not have a prerelease dependency. Either modify the version spec of dependency "microsoft.dotnet.interactive.csharp [1.0.0-beta.23562.1, )" or update the version field in the nuspec. [C:\dev\interactive\samples\extensions\ClockExtension\ClockExtension.csproj] The package ClockExtension.1.0.0 is missing a readme. Go to https://aka.ms/nuget/authoring-best-practices/readme to learn why package readmes are important. Successfully created package 'C:\dev\interactive\samples\extensions\ClockExtension\bin\Release\ClockExtension.1.0.0.nupkg'. Directory: C:\dev\interactive\samples\extensions\ClockExtension\bin\Debug Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 12/5/2023 9:34 AM 9220 ClockExtension.1.0.0.nupkg Directory: C:\dev\interactive\samples\extensions\ClockExtension\bin\Release Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 12/5/2023 12:37 PM 9192 ClockExtension.1.0.0.nupkg
Now we're ready to install the extension that packaged up in the NuGet package we just built. We can use the #i
directive to add the build output folder to our NuGet sources.
First, let's make sure the file is there like we expect after the build.
using System.IO;
// Create an absolute path since #i doesn't like
var debugOutputFolder = new DirectoryInfo(@".\ClockExtension\bin\Release\").FullName;
if (File.Exists(Path.Combine(debugOutputFolder, "ClockExtension.1.0.0.nupkg")))
{
"✅ The package is there!".Display();
}
else
{
"❌ Something must have gone wrong with the build. The package isn't there.".Display();
}
var nugetSource = $"nuget:{debugOutputFolder}";
✅ The package is there!
If the package is there, we can include its location as a NuGet source using the #i
directive. The following syntax shares the #i
argument including the nuget:
prefix and the computed fully-qualified path.
#i @csharp:nugetSource
Now that the package source is added, we can use #r
to install the package.
#r "nuget:ClockExtension,1.0.0"
Loading extension script from `C:\Users\josequ\.nuget\packages\clockextension\1.0.0\interactive-extensions\dotnet\extension.dib`
ClockExtension
is loaded. It adds visualizations for System.DateTime
and System.DateTimeOffset
. Try it by running: DateTime.Now
or #!clock -h
As you can see from the output above, the extension is able to explain a bit about what it does. So now we can try it out.
It adds a custom formatter for System.DateTime
:
DateTime.Now
The extension output also advised us to run #!clock -h
. Extensions can add magic commands and all magic commands can provide help.
#!clock -h
Description: Displays a clock showing the current or specified time. Usage: #!clock [options] Options: -o, --hour <hour> The position of the hour hand -m, --minute <minute> The position of the minute hand -s, --second <second> The position of the second hand -?, -h, --help Show help and usage information
The #!clock
magic command help explains how to use options to set the position of the hands on the clock:
#!clock --hour 12 -m 34 -s 56