عنوان:

‫امکان ساخت قالب برای پروژه‌های NET Core.


نویسنده: وحید نصیری
تاریخ: ۱۳۹۶/۰۵/۱۶ ۱۳:۳۵
آدرس: www.dntips.ir
یکی از قابلیت‌های ابزار خط فرمان dotnet، امکان تبدیل یک پروژه‌ی سفارشی سازی شده، به یک قالب نصب پروژه‌های جدید بر مبنای آن است. برای مثال فرض کنید می‌خواهیم پروژه‌ی DNTIdentity را تبدیل به یک قالب جدید کنیم تا به سادگی بتوان پروژه‌های جدید را بر مبنای آن ایجاد کرد.


ساخت پوشه‌ی مخصوص template.config.

اولین قدم جهت تبدیل یک پروژه‌ی از پیش موجود، به قالبی جدید، افزودن پوشه‌ی ویژه‌ای به نام template.config. به ریشه‌ی آن است. سپس فایل خالی template.json را با محتوای ذیل به آن اضافه کنید:


{ 
  "author": "VahidN <https://www.dntips.ir/>", 
  "classifications": [ "MVC", ".NET Core", "ASP.NET Core" ],  
  "name": "Empty DNT.Identity project", 
  "identity": "DNT.Identity", 
  "shortName": "dntidentity", 
  "tags": { 
    "language": "C#" 
  }, 
  "sourceName": "ASPNETCoreIdentitySample" 
}
توضیحات:
در اینجا متادیتای تعریف شده شامل موارد ذیل است:
Author: اطلاعات نویسنده است.
Classification: امکان جستجوی بهتر این قالب را فراهم می‌کند.
Name: توضیحاتی در مورد پروژه.
Identity: نام منحصربفرد پروژه.
ShortName: نامی است که از آن جهت تولید پروژه‌های جدید، استفاده می‌شود.
SourceName: مهم‌ترین تنظیم این گروه بوده و نام فضای نام اصلی پروژه‌است. زمانیکه پروژه‌ی جدیدی را ایجاد می‌کنید، این نام به صورت خودکار بر اساس نام جدید انتخابی اصلاح و جایگزین خواهد شد (در تمام پروژه‌های مربوط به solution جاری).


معرفی قالب تهیه شده به سیستم dotnet

پس از ساخت فایل template.config\template.json. در ریشه‌ی پروژه، اکنون از طریق خط فرمان به ریشه‌ی پروژه وارد شده و دستور ذیل را صادر کنید:
 dotnet new -i %~dp0
در اینجا dp0~% با آدرس پوشه‌ی جاری جایگزین می‌شود. اگر نیاز است آن‌را به صورت دستی مقدار دهی کنید.
پس از نصب این پوشه به عنوان یک قالب جدید، یکبار از سیستم وجود آن‌را کوئری بگیرید:
 dotnet new --list
اگر به خروجی آن دقت کنید، یک سطر ذیل به آن اضافه شده‌است:
Templates                                         Short Name       Language          Tags                      
---------------------------------------------------------------------------------------------------------------
Console Application                               console          [C#], F#, VB      Common/Console            
Class library                                     classlib         [C#], F#, VB      Common/Library            
Empty DNT.Identity project                        dntidentity      [C#]              MVC/.NET Core/ASP.NET Core


نحوه‌ی ایجاد یک پروژه‌ی جدید بر اساس قالب نصب شده

پس از ساخت این قالب جدید و معرفی آن به سیستم، نحوه‌ی کار با آن به صورت ذیل است:
 dotnet new dntidentity -n MyNewProj
در اینجا dntidentity همان Short Name تنظیم شده‌است و پارامتر n، نام Solution جدید را مشخص می‌کند. پس از اجرای این دستور مشاهده خواهید کرد که این نام جدید بر روی نام پوشه‌ها و همچنین فضاهای نام تولیدی به صورت خودکار اعمال شده‌است و مقدار «ASPNETCoreIdentitySample» پیش‌فرض را بازنویسی کرده‌است.

نظرات

  • پرویز در ۱۳۹۶/۰۷/۰۹ ۱۵:۰
    سلام ، ضمن تشکر 

    dotnet new dntidentity - n MyNewProj را که اجرا می‌کنم، درست اجرا نمیشه.
    • وحید نصیری در ۱۳۹۶/۰۷/۰۹ ۱۵:۱۴
      قصد دارید همین پروژه را در داخل پوشه‌ای که دقیقا همان پروژه از پیش وجود دارد، مجددا ایجاد کنید. یک پوشه‌ی جدید و خالی را در جایی ایجاد کنید (نه در داخل پوشه‌ی پروژه‌ای که از GitHub گرفتید) و سپس این دستور را در آنجا اجرا کنید.
  • امیر توکلی در ۱۳۹۷/۰۲/۰۴ ۱۰:۳۸
    با سلام. من دقیقا همین کارا رو کردم ولی نام پوشه‌ها تغییر پیدا نکرد.

    و سوال بعدی که خدمتتون داشتم این بود که آیا میتونیم همین پروژه تمپلیتمون رو به صورت مستقیم با خود ویژوال استادیو اضافه کنیم با new project

    • وحید نصیری در ۱۳۹۷/۰۲/۰۴ ۱۲:۲۴
      مشکلی مشاهده نشد. مراحل آزمایش شده به این صورت هستند:
      - فایل template.json تعریف قالب از پیش موجود هست.
      - فایل _register_template.bat جهت ثبت این قالب اجرا شد.
      - سپس یک پوشه‌ی خالی جدید در مکانی دیگر ایجاد و دستور «dotnet new dntidentity -n MyNewProj» در آن اجرا شد:

      - این قالب‌های مبتنی بر NuGet، وابستگی به IDE خاصی ندارند و بر اساس SDK آن کار می‌کنند. یعنی چندسکویی هستند.
    • سید سجاد هادیان امرئی در ۱۳۹۸/۰۷/۰۴ ۱۶:۳۳
      با توجه به آپدیت شدن پروژه DNTIdentity-Master با آپدیت جدید dotnetcore3، برای تهیه یک template جدید از پروژه فوق با توجه به دستور فوق ابتدا ویرایش لازم در فایل template.json صورت گرفت و سپس فایل register_template.bat اجرا گردید.سپس در پوشه‌ای جدید دستور dotnet new... اجرا گردید. ولی پوشه‌های هم نام با template پایه ایجاد می‌گردد؟
      • وحید نصیری در ۱۳۹۸/۰۷/۰۴ ۱۹:۴۵
        پس از اجرای فایل _register_template.bat جهت ثبت قالب پیش‌فرض template.json ، مشکلی مشاهده نشد:

    • علی یگانه مقدم در ۱۴۰۰/۰۴/۲۲ ۲:۳۹
      نامی که در قالب برای sourceName میگذارید باید حتما با نام پروژه قالب یکی باشد.اگر نباشد این اتفاق رخ میدهد و امکان تغییر نام پروژه وجود ندارد
  • امیرحسین مرجانی در ۱۳۹۷/۰۳/۱۷ ۱:۱۷
    ضمن تشکر بعد از اجرای دستور
    dotnet new -i %~dp0

    این خطا رو می‌دهد
    C:\Projects\DNTIdentity-master>dotnet new -i %~dp0
      Restoring packages for C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj...
    C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj : error NU1101: Unable to find package %~dp0. No packages exist with this id in source(s): C:\Program Files\dotnet\sdk\NuGetFallbackFolder, Microsoft Visual Studio Offline Packages, nuget.org
      Generating MSBuild file C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\obj\restore.csproj.nuget.g.props.
      Generating MSBuild file C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\obj\restore.csproj.nuget.g.targets.
      Restore failed in 1.95 sec for C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj.

    • وحید نصیری در ۱۳۹۷/۰۳/۱۷ ۱:۲۲
      بجای dp0~ % مسیر پوشه‌ی جاری را دستی وارد کنید.
      • امیرحسین مرجانی در ۱۳۹۷/۰۳/۱۷ ۱:۴۰
        با وارد کردن
        dotnet new -i C:\Projects\DNTIdentity-master
        درست شد، تشکر
  • کیان سبزی در ۱۳۹۷/۰۳/۳۰ ۱۸:۵۳
    پس از ساخت و اجرا و بارگذاری توسط خود Visual Studio فقط نام پروژه‌ها و نام Solution و فایل مربوط به پراپرتی هر پروژه ایجاد می‌شود. بقیه ساختاری که داخل پروژه‌ها وجود داره و پوشه‌ها و کلاس‌های سی شارپ ایجاد نمیشن.
    • وحید نصیری در ۱۳۹۷/۰۳/۳۰ ۲۰:۷
      - من خیلی وقت هست VS 2017 را از سیستم پاک کردم و فقط از VS Code استفاده می‌کنم و مشکلی با آن نیست.
      - برای کار با VS 2017 نصب به روز رسانی‌های آن ضروری است.
      • کیان سبزی در ۱۳۹۷/۰۴/۰۳ ۲۱:۲۰
        پس از اجرای فایل _register_template داخل پروژه بارگذاری شده از مخزن گیت هاب با ارور زیر مواجه میشم : 

        • وحید نصیری در ۱۳۹۷/۰۴/۰۳ ۲۱:۵۳
          - چرا قسمتی از تصویر را ارسال کردید؟ چرا مشخص نیست چه دستوری اجرا شده؟
          - احتمالا بین حروف قسمت‌های مختلف نام پوشه‌ای که درست کردید «فاصله» وجود دارد. دستور «dotnet new -i» را در صفحه‌ی جاری جستجو کنید. این کل کاری است که باید انجام دهید.
  • زمانی فرهاد در ۱۳۹۸/۰۴/۲۷ ۱۰:۱۵
    امکان حذف یا ویرایش قالبی که درست کردیم هست؟
    • وحید نصیری در ۱۳۹۸/۰۴/۲۷ ۱۱:۲۶
      برای عزل آن یا از نام بسته‌ی NuGet استفاده کنید و یا مسیر کامل پوشه‌ای که فایل template.config در آن قرار دارد:
      dotnet new -u <NUGET_PACKAGE_ID>
      dotnet new -u <ABSOLUTE_Path to template.config folder>
  • سید سجاد هادیان امرئی در ۱۳۹۹/۰۱/۰۸ ۱۸:۳۹

      با سلام پس  از نصب قالب و اجرای  دستور dotnet new dntidentity -n StodioHAFT اروری که در عکس میبینید رو مشاهده می‌کنم

    • وحید نصیری در ۱۳۹۹/۰۱/۰۸ ۲۰:۲۹
      آیا از آخرین فایل ثبت قالب استفاده می‌کنید؟
      • سید سجاد هادیان امرئی در ۱۳۹۹/۰۱/۰۸ ۲۲:۹
        بله از آخرین نسخه استفاده می‌کنم مشکلی که وجود داره  اینه که پس از نصب قالب و ورود به پوشه جدید برای ایجاد قالب جدید وقتی دستور 
        dotnet new --list رو اجرا می‌کنم دیگه قالب نصب شده در لیست قالب‌های موجود نیست 
        • وحید نصیری در ۱۳۹۹/۰۱/۰۸ ۲۳:۱۷
          یک تصویر از زمانیکه بر روی فایل یاد شده کلیک کردید و اجرا شده، ارسال کنید.
          • سید سجاد هادیان امرئی در ۱۳۹۹/۰۱/۰۹ ۱۵:۵۱

            این تصویر که با دایره قرمز هم مشخص شده، 

            • وحید نصیری در ۱۳۹۹/۰۱/۲۲ ۸:۱۴
              با هربار نصب SDK جدید، نصب قالب‌های سفارشی باید تکرار شوند.
  • مهدی ملائیان در ۱۴۰۰/۰۱/۱۹ ۱۲:۵۹
    سلام، من آخرین نسخه پروژه DNTIdentity رو Clone می‌کنم 
    و قالب سفارشی رو بر اساس این پروژه می‌سازم ولی به جای نسخه  : 
    TargetFramework>net5.0</TargetFramework> که در پروژه Clone شده هست 
    نسخه : <TargetFramework>netcoreapp1.1</TargetFramework> برای پروژه‌های جدید ایجاد میشه
    اگر ممکنه هست راهنمائی کنید 

    • وحید نصیری در ۱۴۰۰/۰۱/۱۹ ۱۴:۲۱
      - چه تعداد SDK را نصب کردید؟ اگر لیست dotnet --list-sdks طولانی است، بهتر است به کنترل پنل مراجعه کرده و قدیمی‌ها را حذف کنید؛ چون دیگر پشتیبانی نمی‌شوند؛ خصوصا نگارش‌های پیش از 3.1.
      - همیشه هنگام کار با قالب‌های ایجاد شده، امکان ذکر target framework هم هست:
      dotnet new somename --framework net5.0
  • شریعتی پیام در ۱۴۰۰/۰۲/۱۶ ۵:۴۸
    نکته تکمیلی
    در حال حاضر باید خودمان یک پوشه درست بکنیم و داخل آن دستور ایجاد پروژه رو میزنیم، به خاطر اینکه ایجاد خود پوشه پروژه هم خودکار شود، مقدار  preferNameDirectory: true ( ^ ) را به فایل template.json اضافه میکنیم.
    {
      "author": "Firstname and lastname",
      "classifications": [ ".Net core", "AspNetCore" ],
      "name": "Base project",
      "identity": "BaseProject",
      "shortName": "baseproject",
      "tags": {
        "language": "C#"
      },
      "sourceName": "DotnetCoreSample",
      "preferNameDirectory": true // Here
    }
  • رضا تنها در ۱۴۰۰/۱۰/۰۸ ۱۱:۶
    سلام؛ تمامی مراحل بالا رو انجام میدهم و قالب جدید رو ثبت می‌کنم. ولی موقع ایجاد پروژه جدید، پروژه ایجاد میشه ولی دقیقا با نام " ASPNETCoreIdentitySample ". نه نام سولوشن تغییر میکنه و نه پروژه ها.

  • وحید نصیری در ۱۴۰۲/۰۲/۰۲ ۷:۴۶
    یک نکته‌ی تکمیلی
    دستوراتی که در این مطلب ذکر شدند، با پارامترهای list, --search, --install, --uninstall-- هستند. این دستورات در دات نت 7 تغییر کرده و بدون -- ابتدایی شده‌اند. یعنی برای مثال dotnet new --install به dotnet new install تغییر یافته.