تولید برنامه‌های متکی به خود مبتنی بر NET Core.
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

یکی از مزایای جالب فریم‌ورک NET Core. امکان پابلیش کردن اپلیکیشن‌ها به صورت Self-contained یا متکی به خود است. به این نوع توزیع (Self-Contained Deployment (SCD گفته می‌شود. در واقع منظور این است که بر روی سیستم مقصد، نیازی به نصب runtime خاصی نیست. بلکه کافی است اپلیکیشن‌تان را بر روی سیستم مقصد کپی کرده و آن را اجرا کنید. سیستم‌عامل مقصد نیز می‌تواند Windows, OSX و یا Linux باشد. در واقع در حین پابلیش اپلیکیشن‌های Self-contained، کل ران‌تایم NET. موردنیاز جهت اجرای اپلیکیشن نیز ارائه خواهد شد. نوع دیگر توزیع اپلیکیشن‌های دات‌نتی به صورت (FDD (Framework-Dependent Deployment می‌باشد. در این حالت تنها اپلیکیشن را توزیع خواهیم کرد؛ یعنی نیازی به ارائه ران‌تایم، در سیستم مقصد نیست. زیرا فرض بر این است که بر روی سیستم مقصد ران‌تایم موردنیاز از قبل نصب شده است.

مزایای SCD:
- نیازی به نصب NET Core. بر روی سیستم مقصد نیست
- همزمان بر روی سیستم مقصد می‌توانید اپلیکیشن‌هایی را که از نسخه‌های مختلف NET Core. استفاده می‌کنند، اجرا کنید

معایب SCD:
- حجم زیاد اپلیکیشن (برای یک پروژه خالی نزدیک به 50MB)
- تعداد کم RIDs - از این شناسه جهت تعیین سیستم‌عامل مقصد استفاده خواهد شد. مثلاً برای ابونتو این شناسه به صورت ubuntu.14.04-x86 و یا برای ویندوز این شناسه win7-x64 است. در واقع الگوی این شناسه‌ها به صورت [os].[version].[arch]  می‌باشند. سگمنت اول معرف نام سیستم‌عامل، سگمنت دوم معرف نسخه سیستم‌عامل و سگمنت آخر نوع معماری پردازنده می‌باشد: x86, x64, arm, arm64, … لیست کامل این RIDs را می‌توانید از اینجا مشاهده نمائید.

نکته: روش SCD یکسری از وابستگی‌ها را به همراه خود ارائه نمی‌دهد. در نتیجه باید قبل از توزیع، پیشنیازهای لازم را بر روی سیستم مقصد نصب نمائید.
در ادامه نحوه پابلیش یک اپلیکیشن مبتنی بر NET Core. را بر روی سیستم‌عامل Ubuntu بررسی خواهیم کرد.
برای شروع یک پروژه از نوع (Console Application (.NET Core ایجاد کنید. سپس فایل project.json را به صورت زیر تغییر دهید:
{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "runtimes": {
    "ubuntu.16.04-x64": {}
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.1.0"
    }
  },

  "frameworks": {
    "netcoreapp1.1": {

    }
  }
}

همانطور که مشاهده می‌کنید imports از قسمت netcoreapp1.1 حذف گردیده است. همچنین "type="platform نیز حذف گردیده است؛ زیرا این قسمت تعیین خواهد کرد که نحوه توزیع اپلیکیشن به چه صورتی باشد (FDD, SCD)
همچنین درون قسمت runtime نیز RID مربوط به سیستم‌عامل ابونتو را اضافه کرده‌ایم.

پابلیش اپلیکیشن از طریق CLI
در ادامه دستورات زیر را به ترتیب برای بیلد و سپس پابلیش اپلکیشن برای RID تعیین شده وارد خواهیم کرد:


 اکنون اگر مسیر project}\bin\Release\netcoreapp1.1\ubuntu.16.04-x64}  را مشاهده کنید، خواهید دید که خروجی برای سیستم‌عامل موردنظر تولید شده است:


اکنون می‌توانید پوشه publish را به سیستم مقصد منتقل کرده و برای اجرای آن مراحل زیر را طی نمائید.


اجرای اپلیکیشن در سیستم‌عامل Ubuntu

برای اجرای اپلیکیشنی که در مرحله قبل ایجاد کردیم کافی است درون پوشه‌ایی که پروژه در آن قرار دارد فایل اجرایی اپلیکیشن را اجرا کنید:



در حین اجرای اپلیکیشن ممکن است با خطای bash: ./DntSCD: Permission denied  و یا خطای Failed to initialize CoreCLR, HRESULT: 0x8007001F  مواجه شوید. برای حل این مشکل کافی است مجوز لازم را به فایل اجرایی بدهید، تا مشکلی در اجرا اپلیکیشن نداشته باشد:



بخاطر داشته باشید که بر روی سیستم‌عامل Ubuntu هیچ runtimeی را نصب نکرده‌ایم. زیرا توزیع اپلیکیشن به صورت Self-Contained می‌باشد؛ یعنی تمامی پیش‌نیازهای لازم جهت اجرا اپلیکیشن همراه با خود اپلیکیشن ارائه شده است.


نکته: مراحل فوق تنها مختص به توزیع Console Application نیست، بلکه می‌توانید یک اپلیکیشن تحت وب را نیز به صورت SCD توزیع کنید: