Utoljára aktív 7 hours ago

CLI scripts to scaffold a .NET solution with standard layers on macOS, Linux, and Windows

Revízió b0fc14188293894b73f8bf4636831e9cdb97e9e9

README.md Eredeti

How to use

🍎 Linux / macOS

Run the following command in your terminal. Replace MyProjectName with your desired solution name.

# Syntax: curl [url] | bash -s -- [ProjectName]
curl -fsSL https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold_project.sh | bash -s -- MyCleanApp
bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold.sh)"

🪟 Windows (PowerShell)

Run this command to scaffold the solution.

# Syntax: irm [url] | % { & ([scriptblock]::Create($_)) [ProjectName] }
irm "https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold_project.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
scaffold.sh Eredeti
1#!/bin/bash
2
3# --- 0. Determine Project Name ---
4# Grab the name of the current directory
5PROJECT_NAME=$(basename "$PWD")
6
7echo "📂 Using current directory name as project name: $PROJECT_NAME"
8
9# --- 1. Configuration ---
10FORMAT="slnx" # Options: "sln" or "slnx"
11INSTALL_PACKAGES=true # Set to true to install NuGet packages
12
13echo "🚀 Initializing $PROJECT_NAME (Format: $FORMAT)..."
14
15# --- 1.5 Database Selection ---
16echo ""
17echo "🗄️ Select your Database Provider for $PROJECT_NAME:"
18echo " 1) PostgreSQL (Npgsql) [Default]"
19echo " 2) SQL Server"
20echo " 3) SQLite"
21# < /dev/tty allows interactive prompt when piping via curl
22read -p "Enter choice [1-3] (Default: 1): " DB_CHOICE < /dev/tty
23
24case $DB_CHOICE in
25 2)
26 DB_PACKAGE="Microsoft.EntityFrameworkCore.SqlServer"
27 echo " Selected: SQL Server"
28 ;;
29 3)
30 DB_PACKAGE="Microsoft.EntityFrameworkCore.Sqlite"
31 echo " Selected: SQLite"
32 ;;
33 *)
34 DB_PACKAGE="Npgsql.EntityFrameworkCore.PostgreSQL"
35 echo " Selected: PostgreSQL"
36 ;;
37esac
38echo ""
39
40# --- 2. Smart SDK Detection ---
41# Get the latest installed SDK version
42LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
43
44if [ -n "$LATEST_SDK" ]; then
45 echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
46 dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
47else
48 echo "⚠️ No SDK detected. Skipping global.json."
49fi
50
51dotnet new gitignore
52
53# --- 3. Create Solution & Fix NuGet ---
54if [ "$FORMAT" = "slnx" ]; then
55 echo "📄 Creating .slnx solution..."
56 dotnet new sln -n "$PROJECT_NAME" --format slnx
57 SLN_FILE="$PROJECT_NAME.slnx"
58else
59 echo "📄 Creating standard .sln solution..."
60 dotnet new sln -n "$PROJECT_NAME"
61 SLN_FILE="$PROJECT_NAME.sln"
62fi
63
64# Create a local nuget.config to ensure we can find packages
65echo "📦 Configuring NuGet sources..."
66dotnet new nugetconfig --force
67
68# Check if nuget.org is already there, if not, add it
69if ! dotnet nuget list source --configfile "nuget.config" | grep -q "nuget.org"; then
70 dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
71fi
72
73# --- 4. Create Projects ---
74echo "🔨 Creating projects..."
75dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
76dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain"
77dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
78dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
79dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
80
81mkdir -p tests
82dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests"
83dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
84dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
85
86# --- 4.1 CLEANUP BOILERPLATE ---
87echo "🧹 Removing default template files..."
88
89FILES_TO_REMOVE=(
90 "src/$PROJECT_NAME.Shared/Class1.cs"
91 "src/$PROJECT_NAME.Domain/Class1.cs"
92 "src/$PROJECT_NAME.Application/Class1.cs"
93 "src/$PROJECT_NAME.Infrastructure/Class1.cs"
94 "tests/$PROJECT_NAME.Domain.Tests/UnitTest1.cs"
95 "tests/$PROJECT_NAME.Application.Tests/UnitTest1.cs"
96 "tests/$PROJECT_NAME.IntegrationTests/UnitTest1.cs"
97 "src/$PROJECT_NAME.Api/WeatherForecast.cs"
98 "src/$PROJECT_NAME.Api/Controllers/WeatherForecastController.cs"
99 "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.http"
100)
101
102for file in "${FILES_TO_REMOVE[@]}"; do
103 if [ -f "$file" ]; then
104 rm "$file"
105 echo " - Deleted $file"
106 fi
107done
108
109# --- 5. Add to Solution (With Visual Folders) ---
110echo "📂 Organizing solution structure in $SLN_FILE..."
111
112dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
113dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src"
114dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
115dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
116dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
117
118dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests"
119dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
120dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
121
122# --- 6. Add References ---
123echo "🔗 Wiring up dependencies..."
124
125# Shared References
126dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
127dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
128dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
129dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
130
131# Clean Architecture Flow
132dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
133
134dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
135dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
136
137dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
138dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
139
140# Test References
141dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
142dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
143
144dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
145dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
146dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
147
148dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
149dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
150dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
151dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
152dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
153
154# --- 7. Install Nuget Packages (Optional) ---
155if [ "$INSTALL_PACKAGES" = true ]; then
156 echo "📦 Installing standard Clean Architecture packages..."
157
158 add_package() {
159 local proj=$1
160 local pkg=$2
161 echo " + Adding $pkg..."
162 dotnet add "$proj" package "$pkg" > /dev/null 2>&1
163 if [ $? -ne 0 ]; then
164 echo " ⚠️ Failed to add $pkg. Check connection."
165 fi
166 }
167
168 # Application Layer
169 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "MediatR"
170 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation"
171 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
172 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
173
174 # Infrastructure Layer
175 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
176 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "$DB_PACKAGE"
177 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
178
179 # API Layer
180 add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
181 add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Serilog.AspNetCore"
182
183 # Test Projects
184 TEST_PROJECTS=(
185 "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj"
186 "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj"
187 "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj"
188 )
189
190 for proj in "${TEST_PROJECTS[@]}"; do
191 add_package "$proj" "FluentAssertions"
192 add_package "$proj" "Moq"
193 done
194
195 add_package "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
196fi
197
198# --- 8. Final Verification ---
199echo "🏗️ Verifying build..."
200dotnet build
201if [ $? -eq 0 ]; then
202 echo "$PROJECT_NAME scaffolded successfully!"
203else
204 echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
205fi
scaffold_project.ps1 Eredeti
1param(
2 [string]$ProjectName,
3 [ValidateSet("slnx", "sln")]
4 [string]$Format = "slnx",
5 [switch]$SkipPackages = $false
6)
7
8# --- 1. Setup & Validation ---
9if ([string]::IsNullOrWhiteSpace($ProjectName)) {
10 $ProjectName = Read-Host "Please enter a project name"
11}
12
13if ([string]::IsNullOrWhiteSpace($ProjectName)) {
14 Write-Host "❌ Name required." -ForegroundColor Red; exit 1
15}
16
17if (Test-Path $ProjectName) {
18 Write-Host "❌ Directory '$ProjectName' already exists. Aborting to prevent overwrite." -ForegroundColor Red; exit 1
19}
20
21$SlnFile = "$ProjectName.$Format"
22Write-Host "🚀 Scaffolding Clean Architecture (DDD) for: $ProjectName" -ForegroundColor Cyan
23
24# Create Root Directory
25New-Item -ItemType Directory -Path $ProjectName | Out-Null
26Set-Location $ProjectName
27
28# --- 2. Smart SDK Detection ---
29$LatestSdk = dotnet --list-sdks | Select-Object -Last 1 | ForEach-Object { $_.Split(' ')[0] }
30
31if ($LatestSdk) {
32 Write-Host "ℹ️ Detected SDK: $LatestSdk. Pinning global.json..." -ForegroundColor Gray
33 dotnet new globaljson --sdk-version $LatestSdk --roll-forward latestFeature
34}
35
36dotnet new gitignore
37
38# --- 3. Create Solution & Fix NuGet ---
39if ($Format -eq "slnx") { dotnet new sln -n $ProjectName --format slnx }
40else { dotnet new sln -n $ProjectName }
41
42Write-Host "📦 Configuring NuGet sources..." -ForegroundColor Cyan
43dotnet new nugetconfig --force
44$CurrentSources = dotnet nuget list source --configfile "nuget.config"
45if ($CurrentSources -notmatch "nuget.org") {
46 dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
47}
48
49# --- 4. Create Projects ---
50Write-Host "🔨 Creating projects..." -ForegroundColor Cyan
51
52# Source Projects
53dotnet new classlib -n "$ProjectName.Shared" -o "src/$ProjectName.Shared"
54dotnet new classlib -n "$ProjectName.Domain" -o "src/$ProjectName.Domain" # <--- CHANGED
55dotnet new classlib -n "$ProjectName.Application" -o "src/$ProjectName.Application"
56dotnet new classlib -n "$ProjectName.Infrastructure" -o "src/$ProjectName.Infrastructure"
57dotnet new webapi -n "$ProjectName.Api" -o "src/$ProjectName.Api" --use-controllers
58
59# Test Projects
60dotnet new xunit -n "$ProjectName.Domain.Tests" -o "tests/$ProjectName.Domain.Tests" # <--- CHANGED
61dotnet new xunit -n "$ProjectName.Application.Tests" -o "tests/$ProjectName.Application.Tests"
62dotnet new xunit -n "$ProjectName.IntegrationTests" -o "tests/$ProjectName.IntegrationTests"
63
64# --- 4.1 CLEANUP BOILERPLATE ---
65Write-Host "🧹 Removing default template files..." -ForegroundColor Cyan
66
67$FilesToRemove = @(
68 "src/$ProjectName.Shared/Class1.cs",
69 "src/$ProjectName.Domain/Class1.cs", # <--- CHANGED
70 "src/$ProjectName.Application/Class1.cs",
71 "src/$ProjectName.Infrastructure/Class1.cs",
72 "tests/$ProjectName.Domain.Tests/UnitTest1.cs", # <--- CHANGED
73 "tests/$ProjectName.Application.Tests/UnitTest1.cs",
74 "tests/$ProjectName.IntegrationTests/UnitTest1.cs",
75 "src/$ProjectName.Api/WeatherForecast.cs",
76 "src/$ProjectName.Api/Controllers/WeatherForecastController.cs",
77 "src/$ProjectName.Api/$ProjectName.Api.http"
78)
79
80foreach ($File in $FilesToRemove) {
81 if (Test-Path $File) {
82 Remove-Item $File -Force
83 }
84}
85
86# --- 5. Add to Solution ---
87Write-Host "📂 Organizing solution structure..." -ForegroundColor Cyan
88
89# Add Src
90dotnet sln $SlnFile add "src/$ProjectName.Shared/$ProjectName.Shared.csproj" -s "src"
91dotnet sln $SlnFile add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" -s "src" # <--- CHANGED
92dotnet sln $SlnFile add "src/$ProjectName.Application/$ProjectName.Application.csproj" -s "src"
93dotnet sln $SlnFile add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" -s "src"
94dotnet sln $SlnFile add "src/$ProjectName.Api/$ProjectName.Api.csproj" -s "src"
95
96# Add Tests
97dotnet sln $SlnFile add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" -s "tests" # <--- CHANGED
98dotnet sln $SlnFile add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" -s "tests"
99dotnet sln $SlnFile add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" -s "tests"
100
101# --- 6. Add References ---
102Write-Host "🔗 Wiring up dependencies..." -ForegroundColor Cyan
103
104# Shared References (Utility/Kernel)
105dotnet add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
106dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
107dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
108dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
109
110# Application -> Domain
111dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
112
113# Infrastructure -> Application & Domain
114dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
115dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
116
117# API -> Application & Infrastructure
118dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
119dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj"
120
121# Tests
122dotnet add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
123dotnet add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
124
125dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
126dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
127# NOTE: Application tests usually need Domain too for entities
128dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
129
130dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Api/$ProjectName.Api.csproj"
131dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj"
132dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
133dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
134dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
135
136# --- 7. Install Nuget Packages (Optional) ---
137if (-not $SkipPackages) {
138 Write-Host "📦 Installing standard Clean Architecture packages..." -ForegroundColor Cyan
139
140 function Add-Package {
141 param ($Project, $Package)
142 Write-Host " + Adding $Package..." -ForegroundColor Gray
143 dotnet add $Project package $Package
144 }
145
146 # Application Layer
147 Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "MediatR"
148 Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "FluentValidation"
149 Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
150 Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
151
152 # Infrastructure Layer
153 Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
154 Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.SqlServer"
155 Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
156
157 # API Layer
158 Add-Package "src/$ProjectName.Api/$ProjectName.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
159
160 # Test Projects
161 $TestProjects = @(
162 "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj", # <--- CHANGED
163 "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj",
164 "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj"
165 )
166 foreach ($proj in $TestProjects) {
167 Add-Package $proj "FluentAssertions"
168 Add-Package $proj "Moq"
169 }
170
171 Add-Package "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
172}
173
174# --- 8. Final Verification ---
175Write-Host "🏗️ Verifying build..." -ForegroundColor Cyan
176dotnet build
177if ($LASTEXITCODE -eq 0) {
178 Write-Host "$ProjectName scaffolded successfully!" -ForegroundColor Green
179 Write-Host " 👉 cd $ProjectName" -ForegroundColor Gray
180}
scaffold_project.sh Eredeti
1#!/bin/bash
2
3# Usage: ./scaffold.sh MyProjectName [slnx|sln] [true|false for packages]
4# Example: ./scaffold.sh MyCleanApp slnx
5
6# --- 1. Setup & Validation ---
7if [ -z "$1" ]; then
8 echo "❌ Please provide a project name."
9 echo "Usage: ./scaffold.sh MyProjectName [slnx|sln]"
10 exit 1
11fi
12
13PROJECT_NAME=$1
14FORMAT=${2:-slnx}
15INSTALL_PACKAGES=${3:-true} # Default to true
16SLN_FILE="$PROJECT_NAME.$FORMAT"
17
18# Check if directory exists to avoid overwriting
19if [ -d "$PROJECT_NAME" ]; then
20 echo "❌ Directory '$PROJECT_NAME' already exists. Aborting."
21 exit 1
22fi
23
24echo "🚀 Scaffolding $FORMAT solution for: $PROJECT_NAME (Clean Architecture + DDD)"
25
26# Create Root Directory and enter it
27mkdir "$PROJECT_NAME"
28cd "$PROJECT_NAME" || exit
29
30# --- 2. Smart SDK Detection ---
31# Get the latest installed SDK version (e.g. 10.0.102)
32LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
33
34if [ -n "$LATEST_SDK" ]; then
35 echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
36 dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
37else
38 echo "⚠️ No SDK detected. Skipping global.json."
39fi
40
41dotnet new gitignore
42
43# --- 3. Create Solution & Fix NuGet ---
44if [ "$FORMAT" == "slnx" ]; then
45 dotnet new sln -n "$PROJECT_NAME" --format slnx
46else
47 dotnet new sln -n "$PROJECT_NAME"
48fi
49
50# [FIX] Create a local nuget.config to ensure we can find packages
51echo "📦 Configuring NuGet sources..."
52dotnet new nugetconfig --force
53
54# Check if nuget.org is already there
55if ! dotnet nuget list source --configfile "nuget.config" | grep -q "nuget.org"; then
56 dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
57fi
58
59# --- 4. Create Projects ---
60echo "🔨 Creating projects..."
61dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
62dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain" # <--- CHANGED
63dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
64dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
65dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
66
67mkdir -p tests
68dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests" # <--- CHANGED
69dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
70dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
71
72# --- 4.1 CLEANUP BOILERPLATE ---
73echo "🧹 Removing default template files..."
74
75# Define array of files to remove relative to solution root
76FILES_TO_REMOVE=(
77 "src/$PROJECT_NAME.Shared/Class1.cs"
78 "src/$PROJECT_NAME.Domain/Class1.cs" # <--- CHANGED
79 "src/$PROJECT_NAME.Application/Class1.cs"
80 "src/$PROJECT_NAME.Infrastructure/Class1.cs"
81 "tests/$PROJECT_NAME.Domain.Tests/UnitTest1.cs" # <--- CHANGED
82 "tests/$PROJECT_NAME.Application.Tests/UnitTest1.cs"
83 "tests/$PROJECT_NAME.IntegrationTests/UnitTest1.cs"
84 "src/$PROJECT_NAME.Api/WeatherForecast.cs"
85 "src/$PROJECT_NAME.Api/Controllers/WeatherForecastController.cs"
86 "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.http"
87)
88
89for file in "${FILES_TO_REMOVE[@]}"; do
90 if [ -f "$file" ]; then
91 rm "$file"
92 echo " - Deleted $file"
93 fi
94done
95
96# --- 5. Add to Solution (With Visual Folders) ---
97echo "📂 Organizing solution structure..."
98# Source
99dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
100dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src" # <--- CHANGED
101dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
102dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
103dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
104
105# Tests
106dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests" # <--- CHANGED
107dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
108dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
109
110# --- 6. Add References ---
111echo "🔗 Wiring up dependencies..."
112
113# Shared References (Utility/Kernel)
114dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
115dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
116dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
117dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
118
119# Application -> Domain
120dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
121
122# Infrastructure -> Application AND Domain
123dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
124dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
125
126# API -> Application AND Infrastructure
127dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
128dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
129
130# Tests
131dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
132dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
133
134dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
135dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
136dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- ADDED (Application tests need Entities)
137
138dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
139dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
140dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
141dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
142dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- ADDED
143
144# --- 7. Install Nuget Packages (Optional) ---
145if [ "$INSTALL_PACKAGES" = true ]; then
146 echo "📦 Installing standard Clean Architecture packages..."
147
148 # Helper function to add packages safely
149 add_package() {
150 local proj=$1
151 local pkg=$2
152 echo " + Adding $pkg..."
153 dotnet add "$proj" package "$pkg" > /dev/null 2>&1
154 if [ $? -ne 0 ]; then
155 echo " ⚠️ Failed to add $pkg. Check connection."
156 fi
157 }
158
159 # Application Layer
160 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "MediatR"
161 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation"
162 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
163 add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
164
165 # Infrastructure Layer
166 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
167 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.SqlServer"
168 add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
169
170 # API Layer
171 add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
172
173 # Tests
174 TEST_PROJECTS=(
175 "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" # <--- CHANGED
176 "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj"
177 "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj"
178 )
179
180 for proj in "${TEST_PROJECTS[@]}"; do
181 add_package "$proj" "FluentAssertions"
182 add_package "$proj" "Moq"
183 done
184
185 add_package "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
186fi
187
188# --- 8. Final Verification ---
189echo "🏗️ Verifying build..."
190dotnet build
191if [ $? -eq 0 ]; then
192 echo "$PROJECT_NAME scaffolded successfully!"
193 echo "👉 cd $PROJECT_NAME"
194else
195 echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
196fi