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

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


نسخه پیش‌نمایش ۴ دات‌نت ۱۰ امکانی رو فراهم کرده تا بودن فایل پراجکت و سولوشن هم به راحتی بشه کد سی‌شارپ نوشت. قبلا با استفاده از فایل‌های اسکریپت 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($"""

{Markdown.ToHtml(content)}

""", "text/html");

});


app.Run();