Si comme moi, il vous arrive de développer des outils internes pour votre équipe de développeurs, peut-être serez-vous intéressé de savoir comment créer “manuellement” un package dotnet tool.
Cet article vous explique cela étapes par étapes.

Bien dévidemment, pour des projets Console, vous pouvez ajouter les paramètres <PackAsTool> et <ToolCommandName> dans votre csproj. Mais pour un site web, vous avez besoin de toute une série de fichiers qui sont générés uniquement lors de la publication.

1. Créez votre site internet

D’abord vous devez disposer d’un site internet. Vous pouvez en créer rapidement un exemple via dotnet new blazorserver.

Plus tard, nous allons publier ce site web via dotnet publish -c Release -o ./bin/Publish afin de disposer du site web dans un sous dosser bin/publish.

2. Configurez votre projet

Vous devez ajouter ces deux fichiers pour configurer votre projet pour une sortie en package DotNet Tool.

  • Ajoutez ce fichier DotnetTool.nuspec à la racine de votre projet.
    Adapaptez l’id avec le nom de votre outil (ainsi que le numéro de version de dotnet net9.0 que vous utilisez).

    <package>
      <metadata>
        <id>my-tool</id>
        <version>1.0.0</version>
        <authors>Denis Voituron</authors>
        <owners>Denis Voituron</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>
          Add your description here.
        </description>
        <tags>tool</tags>
        <packageTypes>
          <packageType name="DotnetTool" />
        </packageTypes>
      </metadata>
      <files>
        <file src="bin\publish\**\*.*" target="tools\net9.0\any" />
        <file src="DotnetToolSettings.xml" target="tools\net9.0\any\DotnetToolSettings.xml" />
      </files>
    </package>
    
  • Ajoutez également ce fichier DotnetToolSettings.xml à la racine de votre projet.
    Ce fichier précise quel point d’entrée (DLL ou EXE) démarrer lorsque la commande my-tool sera encodée.

    <?xml version="1.0" encoding="utf-8"?>
    <DotNetCliTool Version="1">
      <Commands>
        <Command Name="my-tool" EntryPoint="MyApplication1.dll" Runner="dotnet" />
      </Commands>
    </DotNetCliTool>
    

3. Adapter votre Program.cs

Par défault, votre projet devrait démarrer avec le port 5000 avec un dossier des Assets wwwroot référencé à partir du dossier courant. Vous pouvez adapter cela via ce morceau de code à placer dans votre classe Program

Vous pouvez également démarrer automatiquement le navigateur par défaut pour afficher immédiatement votre site web.

public class Program
{
	public static void Main(string[] args)
	{
#if (RELEASE)
		var wwwRootDirectory = Path.Combine(AppContext.BaseDirectory, "wwwroot");
		var options = new WebApplicationOptions
		{
			WebRootPath = wwwRootDirectory,
			Args = args,
		};

		var builder = WebApplication.CreateBuilder(options);

		builder.WebHost.ConfigureKestrel(serverOptions =>
		{
			serverOptions.ListenAnyIP(6789, listenOptions =>  // 👈 Set a specifi port number
			{
            // Uses the trusted dev cert automatically
				listenOptions.UseHttps(); 
			});
		});
#else
		var builder = WebApplication.CreateBuilder(args);
#endif

		// Keep the existing code
      // ...

		var app = builder.Build();

		// Keep the existing code
      // ...

		// Launch browser only in release mode and when running locally
#if RELEASE
		if (OperatingSystem.IsWindows() || OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
		{
			var url = "https://localhost:6789"; // or your configured URL
                try
			{
				System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
				{
					FileName = url,
					UseShellExecute = true
				});
			}
			catch (Exception ex)
			{
				Console.WriteLine($"Failed to launch browser: {ex.Message}");
			}
		}
#endif

		app.Run();
	}
}

4. Créer le package DotNet Tool

  • Ouvez une console dans le dossier de votre projet et exécutez la commande de publication.
    dotnet publish -c Release -o ./bin/Publish
    

    Vous pouvez également supprimer les dossiers ‘bin’ et ‘obj’ avant la compilation afin de garantir une compilation propre.

  • Ensuite, exécuter cette commande NuGet pour créer le package nupkg.

    nuget pack DotnetTool.nuspec -OutputDirectory ./bin/
    

    Le fichier MyApplication1.x.x.x.nupkg sera généré dans le sous-dossier bin

    Il ne vous reste plus qu’à le pousser vers un flux NuGet interne à votre entreprise ou sur NuGet.org s’il est public.

5. Installer l’outil avant de le publier

  • Exécutez la commande suivante pour installer un certificat de développement auto-signé “localhost” (installation silencieuse).
    dotnet dev-certs https --trust
    
  • Installez l’outil localement via cette commande.
    dotnet tool install --global --add-source ./bin my-tool
    

    Le paramètre --add-source ./bin spécifie l’emplacement du package à installer

  • Tester votre nouvelle commande, ce qui devrait démarrer un site web et ouvrir le navigateur.
    my-tool