Son aktivite 5 hours ago

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

weehong bu gisti düzenledi 5 hours ago. Düzenlemeye git

Değişiklik yok

weehong bu gisti düzenledi 5 hours ago. Düzenlemeye git

1 file changed, 2 insertions, 2 deletions

README.md

@@ -5,7 +5,7 @@ Run the following command in your terminal. Replace `MyProjectName` with your de
5 5
6 6 ```bash
7 7 # Syntax: curl [url] | bash -s -- [ProjectName]
8 - curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.sh | bash -s -- MyCleanApp
8 + curl -fsSL https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold_project.sh | bash -s -- MyCleanApp
9 9 bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold.sh)"
10 10 ```
11 11
@@ -14,5 +14,5 @@ Run this command to scaffold the solution.
14 14
15 15 ```powershell
16 16 # Syntax: irm [url] | % { & ([scriptblock]::Create($_)) [ProjectName] }
17 - irm "https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
17 + irm "https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold_project.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
18 18 ```

weehong bu gisti düzenledi 5 hours ago. Düzenlemeye git

1 file changed, 1 insertion, 1 deletion

README.md

@@ -6,7 +6,7 @@ Run the following command in your terminal. Replace `MyProjectName` with your de
6 6 ```bash
7 7 # Syntax: curl [url] | bash -s -- [ProjectName]
8 8 curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.sh | bash -s -- MyCleanApp
9 - bash -c "$(curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold_install.sh)"
9 + bash -c "$(curl -fsSL https://opengist.rmrf.online/weehong/0d8ec71d1187434aa9323fdc709e8436/raw/HEAD/scaffold.sh)"
10 10 ```
11 11
12 12 ### 🪟 Windows (PowerShell)

weehong bu gisti düzenledi 6 hours ago. Düzenlemeye git

4 files changed, 599 insertions

README.md(dosya oluşturuldu)

@@ -0,0 +1,18 @@
1 + ## How to use
2 +
3 + ### 🍎 Linux / macOS
4 + Run the following command in your terminal. Replace `MyProjectName` with your desired solution name.
5 +
6 + ```bash
7 + # Syntax: curl [url] | bash -s -- [ProjectName]
8 + curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.sh | bash -s -- MyCleanApp
9 + bash -c "$(curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold_install.sh)"
10 + ```
11 +
12 + ### 🪟 Windows (PowerShell)
13 + Run this command to scaffold the solution.
14 +
15 + ```powershell
16 + # Syntax: irm [url] | % { & ([scriptblock]::Create($_)) [ProjectName] }
17 + irm "https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
18 + ```

scaffold.sh(dosya oluşturuldu)

@@ -0,0 +1,205 @@
1 + #!/bin/bash
2 +
3 + # --- 0. Determine Project Name ---
4 + # Grab the name of the current directory
5 + PROJECT_NAME=$(basename "$PWD")
6 +
7 + echo "📂 Using current directory name as project name: $PROJECT_NAME"
8 +
9 + # --- 1. Configuration ---
10 + FORMAT="slnx" # Options: "sln" or "slnx"
11 + INSTALL_PACKAGES=true # Set to true to install NuGet packages
12 +
13 + echo "🚀 Initializing $PROJECT_NAME (Format: $FORMAT)..."
14 +
15 + # --- 1.5 Database Selection ---
16 + echo ""
17 + echo "🗄️ Select your Database Provider for $PROJECT_NAME:"
18 + echo " 1) PostgreSQL (Npgsql) [Default]"
19 + echo " 2) SQL Server"
20 + echo " 3) SQLite"
21 + # < /dev/tty allows interactive prompt when piping via curl
22 + read -p "Enter choice [1-3] (Default: 1): " DB_CHOICE < /dev/tty
23 +
24 + case $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 + ;;
37 + esac
38 + echo ""
39 +
40 + # --- 2. Smart SDK Detection ---
41 + # Get the latest installed SDK version
42 + LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
43 +
44 + if [ -n "$LATEST_SDK" ]; then
45 + echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
46 + dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
47 + else
48 + echo "⚠️ No SDK detected. Skipping global.json."
49 + fi
50 +
51 + dotnet new gitignore
52 +
53 + # --- 3. Create Solution & Fix NuGet ---
54 + if [ "$FORMAT" = "slnx" ]; then
55 + echo "📄 Creating .slnx solution..."
56 + dotnet new sln -n "$PROJECT_NAME" --format slnx
57 + SLN_FILE="$PROJECT_NAME.slnx"
58 + else
59 + echo "📄 Creating standard .sln solution..."
60 + dotnet new sln -n "$PROJECT_NAME"
61 + SLN_FILE="$PROJECT_NAME.sln"
62 + fi
63 +
64 + # Create a local nuget.config to ensure we can find packages
65 + echo "📦 Configuring NuGet sources..."
66 + dotnet new nugetconfig --force
67 +
68 + # Check if nuget.org is already there, if not, add it
69 + if ! 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"
71 + fi
72 +
73 + # --- 4. Create Projects ---
74 + echo "🔨 Creating projects..."
75 + dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
76 + dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain"
77 + dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
78 + dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
79 + dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
80 +
81 + mkdir -p tests
82 + dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests"
83 + dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
84 + dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
85 +
86 + # --- 4.1 CLEANUP BOILERPLATE ---
87 + echo "🧹 Removing default template files..."
88 +
89 + FILES_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 +
102 + for file in "${FILES_TO_REMOVE[@]}"; do
103 + if [ -f "$file" ]; then
104 + rm "$file"
105 + echo " - Deleted $file"
106 + fi
107 + done
108 +
109 + # --- 5. Add to Solution (With Visual Folders) ---
110 + echo "📂 Organizing solution structure in $SLN_FILE..."
111 +
112 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
113 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src"
114 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
115 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
116 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
117 +
118 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests"
119 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
120 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
121 +
122 + # --- 6. Add References ---
123 + echo "🔗 Wiring up dependencies..."
124 +
125 + # Shared References
126 + dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
127 + dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
128 + dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
129 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
130 +
131 + # Clean Architecture Flow
132 + dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
133 +
134 + dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
135 + dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
136 +
137 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
138 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
139 +
140 + # Test References
141 + dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
142 + dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
143 +
144 + dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
145 + dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
146 + dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
147 +
148 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
149 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
150 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
151 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
152 + dotnet 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) ---
155 + if [ "$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"
196 + fi
197 +
198 + # --- 8. Final Verification ---
199 + echo "🏗️ Verifying build..."
200 + dotnet build
201 + if [ $? -eq 0 ]; then
202 + echo "✅ $PROJECT_NAME scaffolded successfully!"
203 + else
204 + echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
205 + fi

scaffold_project.ps1(dosya oluşturuldu)

@@ -0,0 +1,180 @@
1 + param(
2 + [string]$ProjectName,
3 + [ValidateSet("slnx", "sln")]
4 + [string]$Format = "slnx",
5 + [switch]$SkipPackages = $false
6 + )
7 +
8 + # --- 1. Setup & Validation ---
9 + if ([string]::IsNullOrWhiteSpace($ProjectName)) {
10 + $ProjectName = Read-Host "Please enter a project name"
11 + }
12 +
13 + if ([string]::IsNullOrWhiteSpace($ProjectName)) {
14 + Write-Host "❌ Name required." -ForegroundColor Red; exit 1
15 + }
16 +
17 + if (Test-Path $ProjectName) {
18 + Write-Host "❌ Directory '$ProjectName' already exists. Aborting to prevent overwrite." -ForegroundColor Red; exit 1
19 + }
20 +
21 + $SlnFile = "$ProjectName.$Format"
22 + Write-Host "🚀 Scaffolding Clean Architecture (DDD) for: $ProjectName" -ForegroundColor Cyan
23 +
24 + # Create Root Directory
25 + New-Item -ItemType Directory -Path $ProjectName | Out-Null
26 + Set-Location $ProjectName
27 +
28 + # --- 2. Smart SDK Detection ---
29 + $LatestSdk = dotnet --list-sdks | Select-Object -Last 1 | ForEach-Object { $_.Split(' ')[0] }
30 +
31 + if ($LatestSdk) {
32 + Write-Host "ℹ️ Detected SDK: $LatestSdk. Pinning global.json..." -ForegroundColor Gray
33 + dotnet new globaljson --sdk-version $LatestSdk --roll-forward latestFeature
34 + }
35 +
36 + dotnet new gitignore
37 +
38 + # --- 3. Create Solution & Fix NuGet ---
39 + if ($Format -eq "slnx") { dotnet new sln -n $ProjectName --format slnx }
40 + else { dotnet new sln -n $ProjectName }
41 +
42 + Write-Host "📦 Configuring NuGet sources..." -ForegroundColor Cyan
43 + dotnet new nugetconfig --force
44 + $CurrentSources = dotnet nuget list source --configfile "nuget.config"
45 + if ($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 ---
50 + Write-Host "🔨 Creating projects..." -ForegroundColor Cyan
51 +
52 + # Source Projects
53 + dotnet new classlib -n "$ProjectName.Shared" -o "src/$ProjectName.Shared"
54 + dotnet new classlib -n "$ProjectName.Domain" -o "src/$ProjectName.Domain" # <--- CHANGED
55 + dotnet new classlib -n "$ProjectName.Application" -o "src/$ProjectName.Application"
56 + dotnet new classlib -n "$ProjectName.Infrastructure" -o "src/$ProjectName.Infrastructure"
57 + dotnet new webapi -n "$ProjectName.Api" -o "src/$ProjectName.Api" --use-controllers
58 +
59 + # Test Projects
60 + dotnet new xunit -n "$ProjectName.Domain.Tests" -o "tests/$ProjectName.Domain.Tests" # <--- CHANGED
61 + dotnet new xunit -n "$ProjectName.Application.Tests" -o "tests/$ProjectName.Application.Tests"
62 + dotnet new xunit -n "$ProjectName.IntegrationTests" -o "tests/$ProjectName.IntegrationTests"
63 +
64 + # --- 4.1 CLEANUP BOILERPLATE ---
65 + Write-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 +
80 + foreach ($File in $FilesToRemove) {
81 + if (Test-Path $File) {
82 + Remove-Item $File -Force
83 + }
84 + }
85 +
86 + # --- 5. Add to Solution ---
87 + Write-Host "📂 Organizing solution structure..." -ForegroundColor Cyan
88 +
89 + # Add Src
90 + dotnet sln $SlnFile add "src/$ProjectName.Shared/$ProjectName.Shared.csproj" -s "src"
91 + dotnet sln $SlnFile add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" -s "src" # <--- CHANGED
92 + dotnet sln $SlnFile add "src/$ProjectName.Application/$ProjectName.Application.csproj" -s "src"
93 + dotnet sln $SlnFile add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" -s "src"
94 + dotnet sln $SlnFile add "src/$ProjectName.Api/$ProjectName.Api.csproj" -s "src"
95 +
96 + # Add Tests
97 + dotnet sln $SlnFile add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" -s "tests" # <--- CHANGED
98 + dotnet sln $SlnFile add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" -s "tests"
99 + dotnet sln $SlnFile add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" -s "tests"
100 +
101 + # --- 6. Add References ---
102 + Write-Host "🔗 Wiring up dependencies..." -ForegroundColor Cyan
103 +
104 + # Shared References (Utility/Kernel)
105 + dotnet add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
106 + dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
107 + dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
108 + dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
109 +
110 + # Application -> Domain
111 + dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
112 +
113 + # Infrastructure -> Application & Domain
114 + dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
115 + dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
116 +
117 + # API -> Application & Infrastructure
118 + dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
119 + dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj"
120 +
121 + # Tests
122 + dotnet add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
123 + dotnet add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
124 +
125 + dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
126 + dotnet 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
128 + dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
129 +
130 + dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Api/$ProjectName.Api.csproj"
131 + dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj"
132 + dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
133 + dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
134 + dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
135 +
136 + # --- 7. Install Nuget Packages (Optional) ---
137 + if (-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 ---
175 + Write-Host "🏗️ Verifying build..." -ForegroundColor Cyan
176 + dotnet build
177 + if ($LASTEXITCODE -eq 0) {
178 + Write-Host "✅ $ProjectName scaffolded successfully!" -ForegroundColor Green
179 + Write-Host " 👉 cd $ProjectName" -ForegroundColor Gray
180 + }

scaffold_project.sh(dosya oluşturuldu)

@@ -0,0 +1,196 @@
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 ---
7 + if [ -z "$1" ]; then
8 + echo "❌ Please provide a project name."
9 + echo "Usage: ./scaffold.sh MyProjectName [slnx|sln]"
10 + exit 1
11 + fi
12 +
13 + PROJECT_NAME=$1
14 + FORMAT=${2:-slnx}
15 + INSTALL_PACKAGES=${3:-true} # Default to true
16 + SLN_FILE="$PROJECT_NAME.$FORMAT"
17 +
18 + # Check if directory exists to avoid overwriting
19 + if [ -d "$PROJECT_NAME" ]; then
20 + echo "❌ Directory '$PROJECT_NAME' already exists. Aborting."
21 + exit 1
22 + fi
23 +
24 + echo "🚀 Scaffolding $FORMAT solution for: $PROJECT_NAME (Clean Architecture + DDD)"
25 +
26 + # Create Root Directory and enter it
27 + mkdir "$PROJECT_NAME"
28 + cd "$PROJECT_NAME" || exit
29 +
30 + # --- 2. Smart SDK Detection ---
31 + # Get the latest installed SDK version (e.g. 10.0.102)
32 + LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
33 +
34 + if [ -n "$LATEST_SDK" ]; then
35 + echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
36 + dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
37 + else
38 + echo "⚠️ No SDK detected. Skipping global.json."
39 + fi
40 +
41 + dotnet new gitignore
42 +
43 + # --- 3. Create Solution & Fix NuGet ---
44 + if [ "$FORMAT" == "slnx" ]; then
45 + dotnet new sln -n "$PROJECT_NAME" --format slnx
46 + else
47 + dotnet new sln -n "$PROJECT_NAME"
48 + fi
49 +
50 + # [FIX] Create a local nuget.config to ensure we can find packages
51 + echo "📦 Configuring NuGet sources..."
52 + dotnet new nugetconfig --force
53 +
54 + # Check if nuget.org is already there
55 + if ! 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"
57 + fi
58 +
59 + # --- 4. Create Projects ---
60 + echo "🔨 Creating projects..."
61 + dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
62 + dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain" # <--- CHANGED
63 + dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
64 + dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
65 + dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
66 +
67 + mkdir -p tests
68 + dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests" # <--- CHANGED
69 + dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
70 + dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
71 +
72 + # --- 4.1 CLEANUP BOILERPLATE ---
73 + echo "🧹 Removing default template files..."
74 +
75 + # Define array of files to remove relative to solution root
76 + FILES_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 +
89 + for file in "${FILES_TO_REMOVE[@]}"; do
90 + if [ -f "$file" ]; then
91 + rm "$file"
92 + echo " - Deleted $file"
93 + fi
94 + done
95 +
96 + # --- 5. Add to Solution (With Visual Folders) ---
97 + echo "📂 Organizing solution structure..."
98 + # Source
99 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
100 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src" # <--- CHANGED
101 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
102 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
103 + dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
104 +
105 + # Tests
106 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests" # <--- CHANGED
107 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
108 + dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
109 +
110 + # --- 6. Add References ---
111 + echo "🔗 Wiring up dependencies..."
112 +
113 + # Shared References (Utility/Kernel)
114 + dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
115 + dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
116 + dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
117 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
118 +
119 + # Application -> Domain
120 + dotnet 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
123 + dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
124 + dotnet 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
127 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
128 + dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
129 +
130 + # Tests
131 + dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
132 + dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
133 +
134 + dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
135 + dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
136 + dotnet 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 +
138 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
139 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
140 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
141 + dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
142 + dotnet 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) ---
145 + if [ "$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"
186 + fi
187 +
188 + # --- 8. Final Verification ---
189 + echo "🏗️ Verifying build..."
190 + dotnet build
191 + if [ $? -eq 0 ]; then
192 + echo "✅ $PROJECT_NAME scaffolded successfully!"
193 + echo "👉 cd $PROJECT_NAME"
194 + else
195 + echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
196 + fi
Daha yeni Daha eski