<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>.NET Aspire | The .NET Blog</title><link>https://thedotnetblog.com/ar/tags/.net-aspire/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ar</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Fri, 24 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ar/tags/.net-aspire/index.xml" rel="self" type="application/rss+xml"/><item><title>Aspire 13.2 تضيف Bun، وتحسّن الحاويات، وتخفف احتكاك التصحيح</title><link>https://thedotnetblog.com/ar/news/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/news/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</guid><description>يضيف Aspire 13.2 دعماً من الدرجة الأولى لـ Bun في تطبيقات Vite، ويصلح موثوقية Yarn، ويقدم تحسينات في الحاويات تجعل سلوك التطوير المحلي أكثر صراحة ووضوحاً. إليك ما تغيّر فعلاً ولماذا يهم.</description><content:encoded>&lt;p&gt;&lt;em&gt;تمت ترجمة هذه المقالة تلقائيًا. للاطلاع على النسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/news/emiliano-montesdeoca/aspire-132-bun-container-enhancements/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;إذا كنت تبني واجهات خلفية .NET مع واجهات أمامية JavaScript داخل Aspire منذ فترة، فإن الإصدار 13.2 هو ذلك النوع من التحديث الذي يجعل يومك أفضل بهدوء. لا توجد نماذج جديدة لامعة. فقط تحسينات صلبة لأشياء كانت مزعجة قليلاً.&lt;/p&gt;
&lt;p&gt;لنرَ ما الذي وصل فعلاً.&lt;/p&gt;
&lt;h2 id="bun-أصبح-مواطنا-من-الدرجة-الأولى"&gt;Bun أصبح مواطناً من الدرجة الأولى&lt;/h2&gt;
&lt;p&gt;الميزة الأبرز: دعم Bun لتطبيقات Vite في Aspire. استدعاء واحد متسلسل، وانتهى الأمر.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// TypeScript AppHost
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withBun&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;إذا كان فريقك يستخدم Bun بالفعل — وقد يكون كذلك، بالنظر إلى سرعات التثبيت الأسرع بكثير ووقت البدء الأقل — فلن يجبرك Aspire بعد الآن على السير عكس التيار. في السابق كان Aspire يفترض npm وكان عليك الالتفاف حول ذلك. الآن أصبحت &lt;code&gt;.withBun()&lt;/code&gt; خياراً من الدرجة الأولى إلى جانب &lt;code&gt;.withYarn()&lt;/code&gt; والسلوك الافتراضي لـ npm.&lt;/p&gt;
&lt;p&gt;لماذا يهم هذا؟ لأن سرعة أدوات JavaScript تؤثر مباشرة في حلقة التطوير اليومية. إذا كان الواجهة الأمامية لديك تحتاج 30 ثانية لتثبيت الاعتمادات كلما أنشأت بيئة جديدة، فهذا يتراكم. Bun يقلص ذلك بشكل كبير.&lt;/p&gt;
&lt;p&gt;البدائل المكافئة في AppHost بلغة C# موثقة على &lt;a href="https://aspire.dev/integrations/frameworks/javascript/#use-bun"&gt;aspire.dev&lt;/a&gt; إذا كنت تفضل التأليف بلغة C# — تنطبق الأنماط نفسها كلها.&lt;/p&gt;
&lt;h2 id="أصبح-yarn-أكثر-موثوقية"&gt;أصبح Yarn أكثر موثوقية&lt;/h2&gt;
&lt;p&gt;Bun هو العنوان الأبرز، لكن مستخدمي Yarn يحصلون على شيء ربما أكثر أهمية: أخطاء غامضة أقل. يحسن Aspire 13.2 موثوقية &lt;code&gt;withYarn()&lt;/code&gt; مع &lt;code&gt;addViteApp()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;هذه الإصلاحات لا تبدو مثيرة حتى تمضي 20 دقيقة وأنت تحاول معرفة لماذا لم يبدأ مورد أمامي معتمد على Yarn. اعتبره قد تم إصلاحه.&lt;/p&gt;
&lt;h2 id="نشر-الحاويات-الذي-يمكنك-بالفعل-فهمه"&gt;نشر الحاويات الذي يمكنك بالفعل فهمه&lt;/h2&gt;
&lt;p&gt;هناك تحسينان في الحاويات يستحقان المعرفة:&lt;/p&gt;
&lt;h3 id="سياسة-السحب-الصريحة"&gt;سياسة السحب الصريحة&lt;/h3&gt;
&lt;p&gt;أصبح نشر Docker Compose يدعم الآن &lt;code&gt;PullPolicy&lt;/code&gt;، بما في ذلك خيار &lt;code&gt;Never&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ImagePullPolicy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addDockerComposeEnvironment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;compose&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;worker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myorg/worker:latest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Never&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا هو نمط العمل الذي يقول: «استخدم الصورة التي بنيتها بالفعل واترك السجل خارج المعادلة». مفيد جداً عندما تكرر محلياً على صور تبنيها وتنشرها يدوياً، أو عندما ينتج CI صورة وتريد أن يستخدم Compose تلك الصورة بالضبط من دون سحب بعيد متسلل.&lt;/p&gt;
&lt;h3 id="وحدات-تخزين-postgresql-18-تعمل-من-جديد"&gt;وحدات تخزين PostgreSQL 18+ تعمل من جديد&lt;/h3&gt;
&lt;p&gt;غيّر PostgreSQL 18 بنية دليل البيانات الداخلية. وهذا كسر ربط وحدات التخزين في Aspire بصمت — كانت وحدة البيانات تُنشأ لكن الاستمرارية لم تكن تعمل بشكل صحيح فعلياً. الإصدار 13.2 يصلح ذلك.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withDataVolume&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;isReadOnly&lt;/span&gt;: &lt;span class="kt"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;إذا كنت تشغّل PostgreSQL 18 أو أحدث مع وحدة بيانات، فحدّث إلى Aspire 13.2 ولا تفكر في الأمر مرة أخرى.&lt;/p&gt;
&lt;h2 id="تحسينات-جودة-الحياة-في-التصحيح"&gt;تحسينات جودة الحياة في التصحيح&lt;/h2&gt;
&lt;p&gt;بعض الأشياء التي تجعل جلسة AppHost أثناء التصحيح أقل إحباطاً:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DebuggerDisplayAttribute&lt;/code&gt; على الأنواع الأساسية&lt;/strong&gt; — الآن تعرض &lt;code&gt;DistributedApplication&lt;/code&gt; والموارد وتعابير نقاط النهاية قيماً مفيدة في المصحح بدلاً من أن تضطر إلى الغوص داخل أشجار الكائنات&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;رسائل فشل &lt;code&gt;WaitFor&lt;/code&gt; أفضل&lt;/strong&gt; — عندما تفشل الموارد في البدء، يصبح سياق الخطأ مفيداً فعلاً الآن&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BeforeResourceStartedEvent&lt;/code&gt; يُطلق في الوقت الصحيح&lt;/strong&gt; — فقط عندما يكون المورد في طور البدء فعلياً، وليس عند انتقالات حالة غير مرتبطة&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;launchSettings.json&lt;/code&gt; أصبح أكثر مرونة&lt;/strong&gt; — فرصة أقل لأن تؤدي إعدادات معطوبة إلى إفساد بدء التطوير المحلي&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لا شيء من هذه التحسينات مذهل بمفرده، لكنها مجتمعة تزيل احتكاكاً من تجربة التصحيح. إذا اضطررت يوماً إلى التعمق ثلاث طبقات داخل كائن مورد في Aspire لمعرفة أي نقطة نهاية يستخدمها، فإن تحسين عرض المصحح وحده يستحق التحديث.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 إصدار يركز على الجودة. دعم Bun هو العنوان الرئيسي، لكن تحسينات الحاويات والتصحيح هي ما سيجعل العمل اليومي أكثر سلاسة. يستحق التحديث — خصوصاً إذا كنت تستخدم PostgreSQL 18 مع وحدات تخزين البيانات.&lt;/p&gt;
&lt;p&gt;التفاصيل الكاملة في &lt;a href="https://devblogs.microsoft.com/aspire/aspire-bun-support-and-container-enhancements/"&gt;المقال الأصلي لـ David Pine&lt;/a&gt; وفي وثائق &lt;a href="https://aspire.dev/whats-new/aspire-13-2/"&gt;ما الجديد في Aspire 13.2&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>