자신의.NET Core 프로젝트 템 플 릿 만 들 기
모든 사람 은 자신의 습관 적 인 프로젝트 구 조 를 가지 고 프로젝트 안에 해결 방안 폴 더 를 만 드 는 것 을 좋아한다.어떤 사람들 은 전통 적 인 3 층 이름 을 좋아한다.어떤 사람들 은 단일 하고 간단 한 프로젝트 는 csproj 하나 로 해결 하 는 것 을 좋아한다.
어쨌든 무 와 채 소 는 각자 좋아 하 는 것 이 있다.
서로 다른 회사 들 이 이런 것들 에 대해 특정한 요 구 를 할 수도 있 고,자신의 생각 을 개발 하 는 대로 실천 할 수도 있다.
그럼 문제 가 생 겼 습 니 다.만약 새로운 항목 이 있다 면,당신 은 어떻게 만 들 것 입 니까?
아마도 비교적 많은 방식 은 다음 세 가지 일 것 이다.
그러나 이 세 가지 방식 은 시종 만 족 스 럽 지 못 한 점 이 있다.
모두 빈 템 플 릿 을 만 들 었 기 때문에 복잡 한 조작 을 해 야 프로젝트 가 정상적으로 달 릴 수 있다.예 를 들 어 이 공공 류 는 베 끼 고 저 공공 류 는 베 끼 고...시간 낭비 하 는 거 뻔 하 잖 아...
다음은 여러분 의 시간 을 절약 할 수 있 는 작은 방법 을 소개 합 니 다.
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 입 니 다.-h
--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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다. 아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다. 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.