`dotnet run app.cs` से C# फ़ाइलों को सीधे चलाने का तरीका
(devblogs.microsoft.com)- .NET 10 Preview 4 से अब एक single C# फ़ाइल को
dotnet run app.csसे सीधे चलाया जा सकता है, यानी project file के बिना भी C# code execute करना संभव हो गया है - file-based apps की वजह से Python या JavaScript की तरह आसान script execution, testing और idea experimentation अब और भी सरल हो गया है
- NuGet package references, SDK selection, build property settings जैसी चीज़ें भी फ़ाइल के अंदर directives से manage की जा सकती हैं, जिससे development flexibility बढ़ती है
- shebang support के साथ Unix जैसे systems में CLI utilities और automation scripts के लिए भी इसका उपयोग किया जा सकता है
- ज़रूरत पड़ने पर इसे आसानी से project-based app में बदला जा सकता है, इसलिए learning और prototyping से लेकर full-scale app development तक इसका natural flow बनता है
dotnet run app.cs क्या है
- पहले
dotnetCLI से C# code चलाने के लिए project (.csproj) structure ज़रूरी होता था - अब सिर्फ एक .cs फ़ाइल से सीधे execution संभव है, जिससे entry barrier काफ़ी कम हो गया है
- यह scripting languages, automation, experimentation और learning जैसे कई उपयोगों के लिए उपयुक्त है
- CLI integration की वजह से अतिरिक्त tools install किए बिना, सिर्फ dotnet होने पर इसे तुरंत इस्तेमाल किया जा सकता है
- अगर code बड़ा हो जाए, तो उसी language और tools के साथ इसे project-based app में expand किया जा सकता है
file-level directives support
- file-based apps में भी project की मुख्य settings को सीधे .cs फ़ाइल के अंदर directives के रूप में declare किया जा सकता है
-
NuGet package reference
#:packagedirective से NuGet package को सीधे reference किया जा सकता है- उदाहरण:
#:package Humanizer@2.14.1 using Humanizer; var dotNet9Released = DateTimeOffset.Parse("2024-12-03"); var since = DateTimeOffset.Now - dotNet9Released; Console.WriteLine($"It has been {since.Humanize()} since .NET 9 was released.");
- उदाहरण:
-
SDK selection
#:sdkdirective से SDK type specify किया जा सकता है- उदाहरण:
#:sdk Microsoft.NET.Sdk.Web - इससे ASP.NET Core features जैसे minimal API, MVC आदि भी enable किए जा सकते हैं
- उदाहरण:
-
MSBuild property settings
#:propertyसे build properties को सीधे set किया जा सकता है- उदाहरण:
#:property LangVersion preview
- उदाहरण:
-
shell scripts के लिए shebang support
- फ़ाइल के सबसे ऊपर
#!/usr/bin/dotnet runजोड़कर इसे Unix systems में executable file की तरह सीधे इस्तेमाल किया जा सकता है- उदाहरण:
#!/usr/bin/dotnet run Console.WriteLine("Hello from a C# script!"); - execute permission देने के बाद सीधे चलाएँ:
chmod +x app.cs ./app.cs
- उदाहरण:
- फ़ाइल के सबसे ऊपर
project-based app में conversion
- जब app बड़ा हो जाए या ज़्यादा features चाहिए हों, तब
dotnet project convert app.cscommand से इसे आसानी से project में convert किया जा सकता है - directives अपने-आप .csproj फ़ाइल की properties, references आदि में बदल जाते हैं
-
conversion example
- इस तरह की फ़ाइल:
#:sdk Microsoft.NET.Sdk.Web #:package Microsoft.AspNetCore.OpenApi@10.*-* var builder = WebApplication.CreateBuilder(); builder.Services.AddOpenApi(); var app = builder.Build(); app.MapGet("/", () => "Hello, world!"); app.Run();
- इस तरह की फ़ाइल:
-
- conversion result:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.*-*" /> </ItemGroup> </Project>
मौजूदा C# scripting तरीकों से अंतर
- अब तक community tools जैसे CS-Script, dotnet-script, Cake आदि से C# scripts चलाए जा सकते थे, लेकिन इनके लिए अलग tools install और configure करने पड़ते थे
- अब बिना किसी अलग installation या mode के, वही C# compiler और language इस्तेमाल करते हुए तुरंत code चलाया जा सकता है
शुरू कैसे करें
- .NET 10 Preview 4 install करें
- अगर आप Visual Studio Code इस्तेमाल करते हैं, तो C# Dev Kit और C# extension का latest pre-release version (2.79.8 या उससे ऊपर) install करना होगा
.csफ़ाइल बनाएँ और सीधे code लिखें- terminal में
dotnet run hello.csचलाएँ - ज़रूरत हो तो
dotnet project convert hello.csसे project में convert करें
और जानें
आगे की योजना
- VS Code में file-based apps support और directives के लिए IntelliSense सुधार, performance improvement और debugging support को और बेहतर बनाया जाएगा
- multi-file support और execution speed improvement जैसी अतिरिक्त features पर भी काम चल रहा है
dotnet run app.csC# को और आसान बनाता है, साथ ही .NET की पूरी ताकत भी देता है- prototyping, education और production development के बीच तेज़ transition के लिए यह मज़बूत आधार देता है
4 टिप्पणियां
File-based App पर आधारित auto-completion experience देने वाला DX, C# extension के नवीनतम संस्करण में उपलब्ध है, लेकिन मूल रूप से Microsoft इस extension को VS Code Marketplace के अलावा किसी और जगह पर प्रकाशित नहीं कर रहा था.
इस असुविधा को दूर करने के लिए, C# Dev Kit नहीं बल्कि C# Extension वाले हिस्से (MIT license वाला हिस्सा) को अलग से autobuild/auto-publish करने के लिए बनाया गया, उसे OpenVSX पर रजिस्टर किया गया, और इसी के आधार पर Kiro-आधारित एक सरल demo video साझा की जा रही है.
https://www.youtube.com/watch?v=pIi7CWOPQSA
जब मैंने पहले C# Interactive फीचर इस्तेमाल किया था, तब लोकल में इंस्टॉल न किए गए पैकेज इस्तेमाल नहीं किए जा सकते थे, लेकिन अब लगता है कि इसमें सुधार हो गया है।
Hacker News राय
npm run <command>जैसा कोई तरीका हो तो अच्छा होगाgo run github.com/kardianos/json/cmd/jsondiff@v1.0.1। यह काफ़ी शानदार फ़ीचर हैdotnet runपहले से compile results cache कर देता है, इसलिए अलग caching layer की ज़रूरत नहीं होती (disable करने के लिए--no-build, binary path देखने के लिए--artifacts-path)dotnetमें version 10 या 11 में पूरा interpreted mode आने वाला है। सोच रहा हूँ कि क्या यह mode ऐसे use case पर लागू होगा https://github.com/dotnet/runtime/issues/112748*.main.ktsहोना चाहिए तभी यह काम करता है)। यह तरीका छोटे scripts या prototyping के लिए बहुत अच्छा है, और JVM capabilities का उपयोग करने में भी व्यावहारिक है। फिर भी छोटे scripts के लिए Ruby अब भी सबसे सहज है, खासकर external programs चलाते समय backtick syntax बहुत सुविधाजनक है.net10 preview 4 sdkimage में फ़ाइल को सीधे चलाने के लिए shebang test किया था, लेकिन शुरुआत में यह सही नहीं चला।dotnet run <file>से काम हो गया, और update के बाद सीधे भी ठीक चलने लगा। समस्या की वजह यह थी कि फ़ाइल में LF के बजाय CRLF line endings थीं#!/usr/local/share/dotnet/dotnet runया#!/usr/bin/env -S dotnet runलिखना पड़ता है.dump()से values explore करना है। यह नयाdotnet runशायद उसे replace करने के बजाय complement करने वाला tool बन सकता है। पहले एक ऐसी जगह पर, जहाँ PowerShell से बेहद नफ़रत थी, LINQPad से लगभग सारा scripting काम होता था, और वहाँ यह काफ़ी उपयोगी थाdotnet runका अनुभव LINQPad से कितना मिलता-जुलता होगा, यह जानने की जिज्ञासा है। LINQPad की ताकत result visualization है। अगरdotnet runसिर्फ text output दे या बहुत plugins चाहिए हों, तो LINQPad की demand बनी रहेगी। हाँ, अगर सिर्फ syntax जाँचना हो तोdotnet runबेहतर विकल्प हो सकता है। मैं भी कभी-कभी उलझाने वाले syntax को LINQPad में आज़माता हूँमैंने इस फीचर से जुड़े 2 वास्तविक उदाहरण भी बनाए हैं, इसलिए उन्हें जवाब में साझा कर रहा हूँ। ये MCP server और Avalonia का उपयोग करके बनाए गए Windows, macOS GUI app के sample code हैं। 😊
https://forum.dotnetdev.kr/t/…