# تولید برنامه‌های متکی به خود مبتنی بر NET Core.

یکی از مزایای جالب فریم‌ورک NET Core. امکان پابلیش کردن اپلیکیشن‌ها به صورت Self-contained یا متکی به خود است. به این نوع توزیع (Self-Contained Deployment (SCD گفته می‌شود. در واقع منظور این است که بر

- Published: 2017-02-21
- Language: fa
- Tags: DNTips
- Canonical: https://sirwan.info/blog/fa/dntips-2591

---

> این نوشته نخستین بار در [دات‌نت تیپس](https://www.dntips.ir/post/2591) منتشر شده است.

<div class="postBody"><div>یکی از مزایای جالب فریم‌ورک NET Core. امکان پابلیش کردن اپلیکیشن‌ها به صورت Self-contained یا متکی به خود است. به این نوع توزیع (Self-Contained Deployment (SCD گفته می‌شود. در واقع منظور این است که بر روی سیستم مقصد، نیازی به نصب runtime خاصی نیست. بلکه کافی است اپلیکیشن‌تان را بر روی سیستم مقصد کپی کرده و آن را اجرا کنید. سیستم‌عامل مقصد نیز می‌تواند Windows, OSX و یا Linux باشد. در واقع در حین پابلیش اپلیکیشن‌های Self-contained، کل ران‌تایم NET. موردنیاز جهت اجرای اپلیکیشن نیز ارائه خواهد شد. نوع دیگر توزیع اپلیکیشن‌های دات‌نتی به صورت (FDD (Framework-Dependent Deployment می‌باشد. در این حالت تنها اپلیکیشن را توزیع خواهیم کرد؛ یعنی نیازی به ارائه ران‌تایم، در سیستم مقصد نیست. زیرا فرض بر این است که بر روی سیستم مقصد ران‌تایم موردنیاز از قبل نصب شده است.</div> <div> <b> <br/> </b> </div> <div> <b>مزایای SCD:</b> </div> <div> - نیازی به نصب NET Core. بر روی سیستم مقصد نیست</div> <div> - همزمان بر روی سیستم مقصد می‌توانید اپلیکیشن‌هایی را که از نسخه‌های مختلف NET Core. استفاده می‌کنند، اجرا کنید</div> <div> <b> <br/> </b> </div> <div> <b>معایب SCD:</b> </div> <div> - حجم زیاد اپلیکیشن (برای یک پروژه خالی نزدیک به 50MB)</div> <div> - تعداد کم RIDs - از این شناسه جهت تعیین سیستم‌عامل مقصد استفاده خواهد شد. مثلاً برای ابونتو این شناسه به صورت ubuntu.14.04-x86 و یا برای ویندوز این شناسه win7-x64 است. در واقع الگوی این شناسه‌ها به صورت [os].[version].[arch]  می‌باشند. سگمنت اول معرف نام سیستم‌عامل، سگمنت دوم معرف نسخه سیستم‌عامل و سگمنت آخر نوع معماری پردازنده می‌باشد: x86, x64, arm, arm64, … لیست کامل این RIDs را می‌توانید از <a href="https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog#linux-rids">اینجا</a> مشاهده نمائید.</div> <div> <b> <br/> </b> </div> <div> <b>نکته</b>: روش SCD یکسری از وابستگی‌ها را به همراه خود ارائه نمی‌دهد. در نتیجه باید قبل از توزیع، پیشنیازهای لازم را بر روی سیستم مقصد نصب نمائید. <br/> </div> <div>در ادامه نحوه پابلیش یک اپلیکیشن مبتنی بر NET Core. را بر روی سیستم‌عامل Ubuntu بررسی خواهیم کرد.</div> <div>برای شروع یک پروژه از نوع (Console Application (.NET Core ایجاد کنید. سپس فایل project.json را به صورت زیر تغییر دهید:</div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="CSharp" name="code">{&#10;  "version": "1.0.0-*",&#10;  "buildOptions": {&#10;    "emitEntryPoint": true&#10;  },&#10;&#10;  "runtimes": {&#10;    "ubuntu.16.04-x64": {}&#10;  },&#10;&#10;  "dependencies": {&#10;    "Microsoft.NETCore.App": {&#10;      "version": "1.1.0"&#10;    }&#10;  },&#10;&#10;  "frameworks": {&#10;    "netcoreapp1.1": {&#10;&#10;    }&#10;  }&#10;}</pre>
 </div> <br/> <div>همانطور که مشاهده می‌کنید <b>imports</b> از قسمت netcoreapp1.1 حذف گردیده است. همچنین <b>"type="platform</b> نیز حذف گردیده است؛ زیرا این قسمت تعیین خواهد کرد که نحوه توزیع اپلیکیشن به چه صورتی باشد (FDD, SCD)</div> <div>همچنین درون قسمت runtime نیز RID مربوط به سیستم‌عامل ابونتو را اضافه کرده‌ایم.</div> <div> <b> <br/> </b> </div> <div> <b>پابلیش اپلیکیشن از طریق CLI</b> </div> <div>در ادامه دستورات زیر را به ترتیب برای بیلد و سپس پابلیش اپلکیشن برای RID تعیین شده وارد خواهیم کرد:<br/> <br/> </div> <div> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/ba4c8b85bd4a8cba174e.jpg" style="display: block; margin-left: auto; margin-right: auto; cursor: default; height: 622px;"/> </p> </div> <div> <br/>
 اکنون اگر مسیر <b>project}\bin\Release\netcoreapp1.1\ubuntu.16.04-x64}</b>  را مشاهده کنید، خواهید دید که خروجی برای سیستم‌عامل موردنظر تولید شده است:  <br/> <br/> </div> <div> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/2a15e2a3b3d7a4bb8eaf.jpg" style="display: block; margin-left: auto; margin-right: auto; cursor: default; height: 362px;"/> </p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;">اکنون می‌توانید پوشه publish را به سیستم مقصد منتقل کرده و برای اجرای آن مراحل زیر را طی نمائید.</p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <b>اجرای اپلیکیشن در سیستم‌عامل Ubuntu</b> </p> <p style="margin-left: auto; margin-right: auto;">برای اجرای اپلیکیشنی که در مرحله قبل ایجاد کردیم کافی است درون پوشه‌ایی که پروژه در آن قرار دارد فایل اجرایی اپلیکیشن را اجرا کنید:</p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/3f080a881e3eae697647.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;">در حین اجرای اپلیکیشن ممکن است با خطای <b>bash: ./DntSCD: Permission denied</b>  و یا خطای <b>Failed to initialize CoreCLR, HRESULT: 0x8007001F</b>  مواجه شوید. برای حل این مشکل کافی است مجوز لازم را به فایل اجرایی بدهید، تا مشکلی در اجرا اپلیکیشن نداشته باشد:  </p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/b3300b30a5afeacdfdb7.png" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;">بخاطر داشته باشید که بر روی سیستم‌عامل Ubuntu هیچ runtimeی را نصب نکرده‌ایم. زیرا توزیع اپلیکیشن به صورت Self-Contained می‌باشد؛ یعنی تمامی پیش‌نیازهای لازم جهت اجرا اپلیکیشن همراه با خود اپلیکیشن ارائه شده است.</p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <b>نکته:</b> مراحل فوق تنها مختص به توزیع Console Application نیست، بلکه می‌توانید یک اپلیکیشن تحت وب را نیز به صورت SCD توزیع کنید:</p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/b11c4b11d63b5f2f7c30.png" style="display: block; margin-left: auto; margin-right: auto; cursor: nw-resize;"/> </p> </div></div>
