Kursus Singkat di .NET Tools

Dec 01 2022
Bangun alat pengembang canggih yang berjalan di mana saja “Kita menjadi apa yang kita lihat. Kami membentuk alat kami dan kemudian alat kami membentuk kami.

Bangun alat pengembang canggih yang berjalan di mana saja

Bangun Alat .NET di Garasi Anda untuk Kesenangan dan Keuntungan! ( valeriiaarnaud)

“Kita menjadi apa yang kita lihat. Kami membentuk alat kami dan kemudian alat kami membentuk kami. —Marshall McLuhan

Nyalakan Mesin Anda ️

Produktivitas adalah proses yang berubah-ubah yang membutuhkan fokus dan ketekunan. Dengan kompleksitas dalam sistem teknologi yang tumbuh ke tingkat yang sulit diselesaikan, tempat terakhir yang ingin dialami oleh pengembang adalah kompleksitas dalam konfigurasi alat. Terlepas dari pilihan alat tertentu, manfaat memilih konsistensi di seluruh tumpukan teknis tim Anda mencakup peningkatan efisiensi pengembang, penggunaan ulang kode alami, dan kepemilikan fitur bersama.

C# adalah bahasa yang sangat populer dan ekosistem paket .NET sangat besar. Dengan diperkenalkannya MAUI dan ASP.NET Core, dimungkinkan untuk membuat sistem .NET full stack yang lintas platform, cloud-native, dan sangat dapat diskalakan. Jika tim Anda bekerja dalam C#, perkakas .NET sangat cocok.

Tutorial ini memberikan ikhtisar tentang cara membuat alat baris perintah .NET yang dapat didistribusikan dengan NuGet dan dijalankan di Windows, macOS, dan Linux.

Pergi!

Mari kita mulai dengan menginstal .NET 7 . Setelah Anda menginstal .NET, uji sistem Anda dengan mengeluarkan dotnet --versionperintah di jendela 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
};

Saat handlerdipanggil, inputFiledan outputFileakan diteruskan instance yang FileInfodibuat dari nilai string yang diteruskan melalui baris perintah oleh pengguna saat mereka memanggil alat kami. Demikian pula, forcedan verboseakan diatur ke trueatau falsetergantung pada apakah --forcedan/atau --verbosebendera ada.

Untuk mengonfigurasi kita, handlerkita juga harus memanggil rootCommand.SetHandlerdan meneruskan semua argumen yang ingin kita akses.

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);
    }
}

Pemberhentian

Sekarang setelah kita menulis alat kita, mari kita jalankan dengan VS Code untuk memastikannya berfungsi. Ketika Anda membuka folder yang berisi Squeeze.csprojAnda akan melihat prompt berikut.

Kode VS C# Aset yang Diperlukan

Klik tombol Ya untuk menambahkan launch.jsondan tasks.jsonke .vscodefolder di root repo Anda. Jika permintaan ini tidak muncul, Anda dapat menyalin file dari repo pendamping .

Ubah launch.jsonsehingga meneruskan argumen ke program kita saat runtime.

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

Titik Henti Debugger Kode VS

Berhasil! Mari publikasikan alat ke NuGet dan selesaikan dengan kuat.

Putaran Terakhir ️

Sebelum kami dapat menerbitkan ke NuGet, kami perlu membuat akun dan membuat kunci API dengan masuk dan menavigasi ke tautan di bawah.

Kami perlu menginstruksikan nugetperintah untuk mengemas proyek kami sebagai alat. Tambahkan bidang berikut ke Squeeze.csprojbawah <PropertyGroup>bagian.

<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

Anda telah berhasil memublikasikan alat .NET ke NuGet — bagus sekali!

Jika Anda tertarik dengan sedikit tambahan kredit, coba buat Azure CI/CD Pipeline yang secara otomatis menaikkan versi, dan menerbitkan paket Anda.

Terima kasih sudah membaca!

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.