Curso Intensivo em Ferramentas .NET

Dec 01 2022
Crie ferramentas poderosas para desenvolvedores que rodam em qualquer lugar “Nós nos tornamos o que contemplamos. Nós moldamos nossas ferramentas e então nossas ferramentas nos moldam.

Crie poderosas ferramentas de desenvolvedor que rodam em qualquer lugar

Crie ferramentas .NET em sua garagem para diversão e lucro! ( valeriiaarnaud)

“Nós nos tornamos o que contemplamos. Nós moldamos nossas ferramentas e então nossas ferramentas nos moldam.” —Marshall McLuhan

Ligue seus motores ️

A produtividade é um processo inconstante que requer foco e persistência. Com a complexidade dos sistemas tecnológicos crescendo a níveis intratáveis, o último lugar em que os desenvolvedores desejam experimentar a complexidade é na configuração da ferramenta. Independentemente das opções de ferramentas específicas, os benefícios de optar pela consistência em toda a pilha técnica de sua equipe incluem maior eficiência do desenvolvedor, reutilização de código natural e propriedade compartilhada de recursos.

C# é uma linguagem imensamente popular e o ecossistema de pacotes .NET é enorme. Com a introdução do MAUI e do ASP.NET Core, é possível criar sistemas .NET de pilha completa que são multiplataforma, nativos da nuvem e altamente escaláveis. Se sua equipe estiver trabalhando em C#, as ferramentas .NET são uma opção natural.

Este tutorial fornece uma visão geral de como criar uma ferramenta de linha de comando .NET que pode ser distribuída com o NuGet e executada no Windows, macOS e Linux.

Vai!

Vamos começar instalando o .NET 7 . Depois de instalar o .NET, teste seu sistema emitindo o dotnet --versioncomando em uma janela de terminal.

bobby@mbp ~ % dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help         Display help.
  --info            Display .NET information.
  --list-sdks       Display the installed SDKs.
  --list-runtimes   Display the installed runtimes.

path-to-application:
  The path to an application .dll file to execute.

dotnet new console -n Squeeze && cd Squeeze

dotnet add package ZipCreator

dotnet add package System.CommandLine --prerelease

var inputFileArg = new Argument<FileInfo>(
  name: "input",
  description: "Zip file manifest containing glob patterns of file paths to include"
);

var outputFileArg = new Argument<FileInfo>(
  name: "output",
  description: "Path to zip file output"
);

var forceOption = new Option<bool>(
  name: "--force",
  getDefaultValue: () => false,
  description: "Overwrite output file if it exists"
);

var verboseOption = new Option<bool>(
  name: "--verbose",
  getDefaultValue: () => false,
  description: "Show verbose log statements"
);

var rootCommand = new RootCommand("Create a zip via a manifest file containing glob pattern rules");
rootCommand.AddArgument(inputFileArg);
rootCommand.AddArgument(outputFileArg);
rootCommand.AddOption(forceOption);
rootCommand.AddOption(verboseOption);

Action<FileInfo, FileInfo, bool, bool> handler = (inputFile, outputFile, force, verbose) =>
{
  // Handler code goes here
};

Quando handlerfor invocado, inputFileserá outputFilepassado uma instância de FileInfocreated a partir dos valores de string passados ​​por meio da linha de comando pelo usuário quando ele invocar nossa ferramenta. Da mesma forma, forcee verboseserá definido como trueou falsedependendo se os sinalizadores --forcee/ou estiverem presentes.--verbose

Para configurar nosso handlertambém devemos chamar rootCommand.SetHandlere passar todos os argumentos aos quais queremos que ele tenha acesso.

rootCommand.SetHandler(handler, inputFileArg, outputFileArg, forceOption, verboseOption);

using System.CommandLine;
using ZipCreator;

public class Program
{
    [STAThread]
    static public async Task<int> Main(string[] args)
    {
        var inputFileArg = new Argument<FileInfo>(
            name: "input",
            description: "Zip file manifest containing glob patterns of file paths to include"
        );

        var outputFileArg = new Argument<FileInfo>(
            name: "output",
            description: "Path to zip file output"
        );

        var forceOption = new Option<bool>(
            name: "--force",
            getDefaultValue: () => false,
            description: "Overwrite output file if it exists"
        );

        var verboseOption = new Option<bool>(
            name: "--verbose",
            getDefaultValue: () => false,
            description: "Show verbose log statements"
        );

        var rootCommand = new RootCommand("Create a zip via a manifest file containing glob pattern rules");
        rootCommand.AddArgument(inputFileArg);
        rootCommand.AddArgument(outputFileArg);
        rootCommand.AddOption(forceOption);
        rootCommand.AddOption(verboseOption);

        Action<FileInfo, FileInfo, bool, bool> handler = (inputFile, outputFile, force, verbose) =>
        {
            Console.WriteLine(inputFile.FullName);
            Console.WriteLine(inputFile.FullName);
            Console.WriteLine(force.ToString());
            Console.WriteLine(verbose.ToString());
        };

        rootCommand.SetHandler(handler, inputFileArg, outputFileArg, forceOption, verboseOption);

        return await rootCommand.InvokeAsync(args);
    }
}

Pit Stop

Agora que escrevemos nossa ferramenta, vamos executá-la com o VS Code para garantir que funcione. Ao abrir a pasta que contém Squeeze.csproj, você verá o seguinte prompt.

Ativos necessários do código VS C#

Clique no botão Sim para adicionar launch.jsone tasks.jsonà .vscodepasta na raiz do seu repositório. Se este prompt não aparecer, você pode copiar os arquivos do repositório complementar .

Modifique launch.jsonpara que passe argumentos para nosso programa em tempo de execução.

"args": [
    "input.txt",
    "output.zip",
    "--verbose"
]

Ponto de interrupção do depurador de código VS

Funciona! Vamos publicar a ferramenta no NuGet e terminar bem.

Volta final ️

Antes de podermos publicar no NuGet, precisamos criar uma conta e gerar uma chave de API entrando e navegando até o link abaixo.

Precisamos instruir o nugetcomando para empacotar nosso projeto como uma ferramenta. Adicione os seguintes campos Squeeze.csprojabaixo da <PropertyGroup>seção.

<PackAsTool>true</PackAsTool>
<ToolCommandName>squeeze</ToolCommandName>

dotnet pack --configuration Release

dotnet nuget push ./bin/Release/Squeeze.1.0.0.nupkg --source https://api.nuget.org/v3/index.json --api-key <Your NuGet API key>

dotnet tool install --global Squeeze

bobby@mbp % squeeze -h

Description:
  Create a zip via a manifest file containing glob pattern rules

Usage:
  Squeeze <input> <output> [options]

Arguments:
  <input>   Zip file manifest containing glob patterns of file paths to include
  <output>  Path to zip file output

Options:
  --force         Overwrite output file if it exists [default: False]
  --verbose       Show verbose log statements [default: False]
  --version       Show version information
  -?, -h, --help  Show help and usage information

Você publicou com sucesso uma ferramenta .NET no NuGet — muito bem!

Se você estiver interessado em um pouco de crédito extra, tente criar um pipeline de CI/CD do Azure que incrementa automaticamente a versão e publica seu pacote.

Obrigado por ler!

Want to Connect?

If you found the information in this tutorial useful please subscribe on Medium, follow me on Twitter, and/or subscribe to my YouTube channel.