📔 ساده‌تر شدن اجرای نرم‌افزارهای کوچیک در دات‌نت ۱۰

👁 958 بازدید ❤️ 27 واکنش 📤 8 فوروارد

📔 ساده‌تر شدن اجرای نرم‌افزارهای کوچیک در دات‌نت ۱۰


نسخه پیش‌نمایش ۴ دات‌نت ۱۰ امکانی رو فراهم کرده تا بودن فایل پراجکت و سولوشن هم به راحتی بشه کد سی‌شارپ نوشت. قبلا با استفاده از فایل‌های اسکریپت csx. هم می‌شد این کار رو کرد، ولی امکان جدید، جامع‌تر و ساده‌تره.

کابردش: آموزش، اسکریپت‌های مورد استفاده برای DevOps و...

ابتدای فایل به ذکر :# و بعدش skd یا package چیزهایی رو که قبلا توی فایل csproj مشخص می‌کردیم، اینجا می‌تونیم توی یک فایل قرار بدیم.


مثلا: کد زیر فقط با یه فایل cs کار می‌کنه و چک می‌کنه اگر rabbitmq و postgresql اوکی بودن، ورژن نرم‌افزار رو توی دیتابیس به‌روز می‌کنه و یه وب‌پیچ هم محیا می‌کنه برای مشاهده وضعیت.



#! /usr/bin/dotnet run

#:sdk Microsoft.NET.Sdk.Web
#:package [email protected].*
#:package [email protected].*
#:package [email protected].*


using Markdig;
using Npgsql;
using RabbitMQ.Client;
using System.Reflection;

var rabbitMqHost = Environment.GetEnvironmentVariable("RABBITMQ_CONNECTION_STRING") 
    ?? "amqp://guest:guest@localhost:5672/";
var pgConnStr = Environment.GetEnvironmentVariable("POSTGRES_CONNECTION_STRING") 
    ?? "Host=localhost;Username=postgres;Password=yourpassword;Database=yourdb";

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", async () =>
{
    bool rabbitOk = false;
    try
    {
        var factory = new ConnectionFactory() { Uri = new Uri(rabbitMqHost) };
        using var connection = factory.CreateConnection();
        using var channel = connection.CreateModel();
        rabbitOk = connection.IsOpen && channel.IsOpen;
    }
    catch { rabbitOk = false; }

    bool pgOk = false;
    string errorMsg = "";
    try
    {
        using var conn = new NpgsqlConnection(pgConnStr);
        await conn.OpenAsync();
        pgOk = conn.State == System.Data.ConnectionState.Open;

        var version = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "unknown";
        var now = DateTime.Now;

        using var cmd = new NpgsqlCommand(
            "INSERT INTO application (checked_at, version, rabbitmq_ok, postgres_ok) VALUES (@date, @ver, @rmq, @pg)", conn);
        cmd.Parameters.AddWithValue("date", now);
        cmd.Parameters.AddWithValue("ver", version);
        cmd.Parameters.AddWithValue("rmq", rabbitOk);
        cmd.Parameters.AddWithValue("pg", pgOk);
        await cmd.ExecuteNonQueryAsync();
    }
    catch (Exception ex)
    {
        errorMsg = ex.Message;
    }


    var content = $"""
    # System Health Check

    - **RabbitMQ:** {(rabbitOk ? "OK" : "FAILED")}
    - **PostgreSQL:** {(pgOk ? "OK" : "FAILED")}
    {(string.IsNullOrWhiteSpace(errorMsg) ? "" : $"\n- **Error:** {errorMsg}")}
    """;

    return Results.Content($"""
        <html>
            <body style="font-family: sans-serif;">
                {Markdown.ToHtml(content)}
            </body>
        </html>
        """, "text/html");
});

app.Run();

← بازگشت به همه پست‌ها