자신의.NET Core 프로젝트 템 플 릿 만 들 기

머리말
모든 사람 은 자신의 습관 적 인 프로젝트 구 조 를 가지 고 프로젝트 안에 해결 방안 폴 더 를 만 드 는 것 을 좋아한다.어떤 사람들 은 전통 적 인 3 층 이름 을 좋아한다.어떤 사람들 은 단일 하고 간단 한 프로젝트 는 csproj 하나 로 해결 하 는 것 을 좋아한다.
어쨌든 무 와 채 소 는 각자 좋아 하 는 것 이 있다.
서로 다른 회사 들 이 이런 것들 에 대해 특정한 요 구 를 할 수도 있 고,자신의 생각 을 개발 하 는 대로 실천 할 수도 있다.
그럼 문제 가 생 겼 습 니 다.만약 새로운 항목 이 있다 면,당신 은 어떻게 만 들 것 입 니까?
아마도 비교적 많은 방식 은 다음 세 가지 일 것 이다.
  • 간단 하고 거 친 형 입 니 다.VS 를 열 면 오른쪽 단 추 를 누 르 고 가방 을 도입 하여 항목 마다 인용 을 추가 합 니 다.
  • 스 크 립 트 형 은 dotnet cli 를 기반 으로 솔 루 션 을 만 들 고 프로젝트 를 만 들 고 가방 을 추가 하 며 프로젝트 인용 을 추가 합 니 다.
  • 대형,VS 프로젝트 템 플 릿 이 VS 위 에 직접 통합 되 었 습 니 다.
  • 예전 에 도 dotnet cli 를 기반 으로 sh 나 ps 스 크 립 트 를 작성 한 다음 에 이 스 크 립 트 로 새 프로젝트 를 만 들 었 습 니 다.
    그러나 이 세 가지 방식 은 시종 만 족 스 럽 지 못 한 점 이 있다.
    모두 빈 템 플 릿 을 만 들 었 기 때문에 복잡 한 조작 을 해 야 프로젝트 가 정상적으로 달 릴 수 있다.예 를 들 어 이 공공 류 는 베 끼 고 저 공공 류 는 베 끼 고...시간 낭비 하 는 거 뻔 하 잖 아...
    다음은 여러분 의 시간 을 절약 할 수 있 는 작은 방법 을 소개 합 니 다.
    dotnet cli 를 기반 으로 프로젝트 템 플 릿 을 만 듭 니 다.즉,흔히 말 하 는 비계 입 니 다.
    dotnet cli 프로젝트 템 플 릿 예열
    본론 을 시작 하기 전에 dotnet cli 가 가지 고 있 는 템 플 릿 을 살 펴 보 자.

    종류 가 많은 것 을 볼 수 있 습 니 다.대부분의 시간 을 웹 API 를 쓰 고 있 기 때문에 웹 API 로 간단 한 템 플 릿 을 씁 니 다.
    다음은 dotnet cli 를 기반 으로 템 플 릿 을 작성 합 니 다.
    자신의 템 플 릿 을 작성 하 다
    템 플 릿 이 라면 분명 샘플 항목 이 있 을 것 이다.
    다음은 우리 가 샘플 프로젝트 를 하나 만 들 겠 습 니 다.대체적으로 이렇게 되면 여러분 은 자신의 습관 에 따라 충분히 할 수 있 습 니 다.

    이것 은 바로 일반적인 프로젝트 입 니 다.그 안에 NLog,Swagger,Dapper 등 구성 요 소 를 추 가 했 고 각 항목 의 인용 관 계 는 잘 되 었 습 니 다.
    우주 에서 공유 하 는 웹 호스트 빌 더 Jexus Extensions 와 같은 공공 클래스 도 포함 되 어 있다.

    다음은 이 템 플 릿 이 달 리 는 효과 입 니 다.

    간단 한 Swagger 페이지 입 니 다.
    현재 샘플 이 이미 있 는데,어떻게 이 샘플 을 하나의 모델 로 바 꿀 수 있 습 니까?
    정 답 은template.json!
    샘플 의 루트 디 렉 터 리 에 폴 더.template.config를 만 들 고 이 폴 더 아래 에 만 듭 니 다template.json.
    예 는 다음 과 같다.
    
    {
      "author": "Catcher Wong", //  
      "classifications": [ "Web/WebAPI" ], //  ,       Tags
      "name": "TplDemo", //  ,       Templates
      "identity": "TplDemoTemplate", //  ,       
      "shortName": "tpl", //  ,       Short Name
      "tags": {
       "language": "C#" ,
       "type":"project"
      },
      "sourceName": "TplDemo", //   ,      
      "preferNameDirectory": true //   ,     
    }
    여기 서 중요 한 것 이 몇 개 있 습 니 다.하 나 는 shortName 이 고 하 나 는 sourceName 입 니 다.
  • shortName,약자,게 으 름 피 우 는 데 필수,예 를 들 어 쓸 수 있 으 면 절대 쓰 지 않 는 다-h
  • sourceName,이것 은 선택 할 수 있 는 필드 입 니 다.그 값 은 지정 한 항목 이름 을 바 꿉 니 다.보통 항목 이름 을 여기에 할당 합 니 다.지정 하지 않 으 면 만 든 항목 은 샘플 항목 과 일치 합 니 다.
  • --help을 다 쓴 후에 이 템 플 릿 을 우리 cli 에 설치 해 야 합 니 다.template.json템 플 릿 을 설치 합 니 다.
    다음은 설치 예시 입 니 다.
    
    dotnet new -i ./content/TplDemo
    여기 서 주의해 야 할 것 은dotnet new -i폴 더 와 같은 등급 의 디 렉 터 리 가 템 플 릿 에 포 함 됩 니 다.
    설치 명령 을 실행 한 후에 우리 의 템 플 릿 이 이미 설치 되 어 있 는 것 을 볼 수 있 습 니 다.

    이 럴 때 는 이 템 플 릿 을 시험 해 보고 싶 어 오금 이 저 렸 다.
    먼저 이 템 플 릿 의 도움말 정 보 를 보 세 요.
    
    dotnet new tpl -h

    아직 파 라 메 터 를 설정 하지 않 았 기 때문에 파 라 메 터 가 없습니다.
    다음은 프로젝트 를 만들어 보 겠 습 니 다.

    프로젝트 를 만 드 는 것 부터 실행 하 는 것 까지 간단 하고 효과 도 우리 가 예상 한 것 이다.
    새로 만 든 HelloTpl 프로젝트 의 디 렉 터 리 구조 가 우리 템 플 릿 과 같 는 지 살 펴 보 겠 습 니 다.

    이름 을 제외 한 다른 내용 은 모두 같다 는 것 을 알 수 있다.
    복사 도 덜 하고 코드 도 많이 붙 일 수 있 을 것 같 지 않 아 요?
    비록 지금 프로젝트 를 만 들 면 큰 템 플 릿 을 완전한 copy 로 만 들 수 있 지만 유연성 이 없 습 니 다!
    동료 들 이 물 어 볼 지도 모 르 는데,이미 편리 한데,왜 융통성 이 없다 고 하 는 거 야?
    내 가 천천히 말 하 는 것 을 들 어 라.
    이 템 플 릿 이 크 고 완전한 템 플 릿 이 라면 미들웨어 A,미들웨어 B,미들웨어 C 등 N 개의 미들웨어 를 포함 합 니 다!
    그리고 새로운 프로젝트 를 건설 할 때 중간 부품 A 만 사용 한 다 는 것 을 명 확 히 했다.그러면 다른 중간 부품 은 우리 에 게 큰 존재 의미 가 없 을 것 이다!
    코드 에 남 은 파일 을 나타 내 려 고 하지 않 을 때 가 많 습 니 다.제어 할 방법 이 있 습 니까?
    답 은 확실 해!필요 없 는 서 류 를 제거 하면 됩 니 다.
    파일 필터
    템 플 릿 항목 중 하나.template.config가 있 습 니 다.이 를 예 로 들 겠 습 니 다.

    우 리 는 아래 의 몇 가지 일 만 하면 된다.
    첫 번 째 단계,RequestLogMiddleware에 필터 추가
    이름template.json의 symbol 을 추가 합 니 다.동시에 원본 파일 지정
    
    {
      "author": "Catcher Wong",
      //others...
      "symbols":{
       //    RequestLog  Middleware
       "EnableRequestLog": {
        "type": "parameter", //    
        "dataType":"bool", //bool     
        "defaultValue": "false" //      
       }
      },
      "sources": [
       {
         "modifiers": [
           {
             "condition": "(!EnableRequestLog)", //  , EnableRequestLog    
             "exclude": [ //       
              "src/TplDemo/Middlewares/RequestLogMiddleware.cs",
              "src/TplDemo/Middlewares/RequestLogServiceCollectionExtensions.cs" 
             ]
           }
         ]
       }
      ]  
     }
    두 번 째 단 계 는 템 플 릿 코드 에서 처리 합 니 다.
    주로EnableRequestLog입 니 다.Middleware 가 여기 서 사용 되 기 때 문 입 니 다.
    
      using System;
      //other using...
      using TplDemo.Core;
    #if (EnableRequestLog)  
      using TplDemo.Middlewares;
    #endif
    
      /// <summary>
      /// 
      /// </summary>
      public class Startup
      {
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
          //other code....
    #if (EnableRequestLog)
          //request Log
          app.UseRequestLog();
    #endif      
          app.UseMvc(routes =>
          {
            routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
          });
        }
      }
    이렇게 되면Startup.cs이 true 라면 이 두 단락 의 코드 를 포함 할 수 있다.
    설 치 된 템 플 릿 을 업데이트 합 니 다.
    이 럴 때 도움 정 보 를 보면 우리 가 추가 한 인 자 를 볼 수 있 습 니 다.

    기본 값 을 만 듭 니 다.(RequestLog 를 사용 하지 않 음)
    
    dotnet new tpl -n NoLog
    이 명령 은 등가 이다.
    
    dotnet new tpl -n WithLog -E false
    다음은 만들어 진 디 렉 터 리 구조 와 Startup.cs 입 니 다.

    RequestLog 와 관련 된 것 이 보이 지 않 습 니 다.
    RequestLog 를 사용 하 는 것 을 만 들 고 정말 효과 가 있 는 지 확인 하 세 요.
    
    dotnet new tpl -n WithLog -E true

    보 실 수 있 습 니 다.효과 가 나 왔 습 니 다.
    다음은 비교적 유용 한 특성 을 소개 한다.동적 전환,이것 은 사실 위 에서 소개 한 내용 과 비슷 합 니 다.
    동적 전환
    직접 예 를 들 어 설명 합 시다.
    만약 에 우리 의 템 플 릿 이 MSSQL,MySQL,PgSQL 과 SQLite 네 가지 데이터 베 이 스 를 지원 한다 고 가정 합 니 다.
    프로젝트 를 새로 만 들 때 그 중 하나 만 필요 합 니 다.예 를 들 어 PgSQL 을 만 들 려 면 다른 세 가 지 를 보고 싶 지 않 을 것 입 니 다.
    여기 서 보고 싶 지 않 습 니 다.두 곳 이 있 습 니 다.하 나 는 nuget 가방 의 인용 이 고 하 나 는 코드 입 니 다.
    지난 소절 은 어떤 구체 적 인 기능 에 대해 스위치 를 작 동 했 는데 여기 4 개가 있 는데 우 리 는 어떻게 처리 해 야 합 니까?
    우 리 는 유형EnableRequestLog의 매개 변수 로 이 조작 을 완성 할 수 있다.
    수정choice,아래 내용 추가
    
    {
     "author": "Catcher Wong",
     //others
     "symbols":{
      "sqlType": {
       "type": "parameter",
       "datatype": "choice",
       "choices": [
        {
         "choice": "MsSQL",
         "description": "MS SQL Server"
        },
        {
         "choice": "MySQL",
         "description": "MySQL"
        },
        {
         "choice": "PgSQL",
         "description": "PostgreSQL"
        },
        {
         "choice": "SQLite",
         "description": "SQLite"
        }
       ],
       "defaultValue": "MsSQL",
       "description": "The type of SQL to use"
      }, 
      "MsSQL": {
       "type": "computed",
       "value": "(sqlType == \"MsSQL\")"
      },
      "MySQL": {
       "type": "computed",
       "value": "(sqlType == \"MySQL\")"
      },
      "PgSQL": {
       "type": "computed",
       "value": "(sqlType == \"PgSQL\")"
      },
      "SQLite": {
       "type": "computed",
       "value": "(sqlType == \"SQLite\")"
      }
     }
    }
    위 에 있 는 JSON 내용 을 보고 여러분 도 그 이 유 를 아 실 거 라 고 믿 습 니 다.sqlType 이라는 인자 가 있 습 니 다.데이터베이스 선택 이 몇 개 있 습 니 다.기본 값 은 MsSQL 입 니 다.
    또한 몇 개의 계산 형 매개 변 수 를 정 의 했 는데 그 수 치 는 sqlType 의 값 과 밀접 한 관 계 를 가진다.
    MsSQL,MySQL,PgSQL,SQLite 라 는 네 개의 매개 변수 도 우리 가 코드 에서 사용 해 야 할 것 입 니 다!!
    csproj 파일 을 수정 하여 sqlType 에 따라 nuget 패 키 지 를 동적 으로 참조 할 수 있 도록 합 니 다.아래 내용 을 추가 합 니 다.
    
    <ItemGroup Condition="'$(MySQL)' == 'True' "> 
      <PackageReference Include="MySqlConnector" Version="0.47.1" />
    </ItemGroup>
    
    <ItemGroup Condition="'$(PgSQL)' == 'True' "> 
      <PackageReference Include="Npgsql" Version="4.0.3" />
    </ItemGroup>
    
    <ItemGroup Condition="'$(SQLite)' == 'True' "> 
      <PackageReference Include="Microsoft.Data.Sqlite" Version="2.1.0" />
    </ItemGroup>
    마찬가지 로 코드 도 상응하는 처 리 를 해 야 한다
    
    #if (MsSQL)
      using System.Data.SqlClient;
    #elif (MySQL)
      using MySql.Data.MySqlClient;
    #elif (PgSQL)
      using Npgsql;
    #else 
      using Microsoft.Data.Sqlite;
    #endif
    
      protected DbConnection GetDbConnection()
      {
    #if (MsSQL)      
        return new SqlConnection(_connStr);
    #elif (MySQL)      
        return new MySqlConnection(_connStr);
    #elif (PgSQL)       
        return new NpgsqlConnection(_connStr);
    #else       
        return new SqliteConnection(_connStr);
    #endif       
      }
    수정 한 후에 도 이 템 플 릿 을 다시 설치 해 야 합 니 다.설치 한 후에 sqlType 이라는 인 자 를 볼 수 있 습 니 다.

    다음은 비교 와 검증 을 위해 MsSQL 과 PgSQL 의 항목 을 각각 만 듭 니 다.
    선후 하여 집행 하 다
    
    dotnet new tpl -n MsSQLTest -s MsSQL 
    dotnet new tpl -n PgSQLTest -s PgSQL
    그리고 대응 하 는 csproj 를 엽 니 다.

    PgSQL 의 이 가방 을 많이 추가 한 것 을 볼 수 있 습 니 다template.json.MsSQL 은 없다.
    마찬가지 로 Dapper Repository Base 도 같은 효과 다.Connection 대상 을 만 들 때 템 플 릿 에 따라 생 성 됩 니 다.

    물론 이것 은 우리 가 현지에서 설치 한 템 플 릿 으로 다른 사람들 은 사용 할 수 없다.
    공개 하고 싶 으 면 nuget 위 에 올 려 도 됩 니 다.회사 내부 에서 공유 하면 내부 nuget 서 비 스 를 구축 하여 템 플 릿 을 내부 서버 에 업로드 할 수 있 습 니 다.
    다음은 상 자 를 열 수 있 는 템 플 릿 입 니 다.https://dotnetnew.azurewebsites.net/
    총결산
    자신의 프로젝트 템 플 릿(비계)이 있어 서 매우 편리 하 다.
    자신 이 필요 로 하 는 것 을 만 들 고 불필요 한 코드 복 제 를 줄 이면 업무 수행 에 더 많은 정력 을 기울 일 수 있다.
    평소에 도 약간의 축적 이 있어 야 한다.충분 한 축적 이 되면 우리 의 비 계 는 매우 강해 질 것 이다.
    참고 문서
    dotnet new 아래 기본 템 플 릿https://github.com/aspnet/Templating
    templating 의 소스 코드https://github.com/dotnet/templating
    template.json 의 설명https://github.com/dotnet/templating/wiki/Reference-for-template.json
    dotnet cli 문서https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet?tabs=netcore21
    마지막 으로 글 의 예제 코드 이다.
    Template
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기