|
param( |
|
[string]$ProjectName, |
|
[ValidateSet("slnx", "sln")] |
|
[string]$Format = "slnx", |
|
[switch]$SkipPackages = $false |
|
) |
|
|
|
# --- 1. Setup & Validation --- |
|
if ([string]::IsNullOrWhiteSpace($ProjectName)) { |
|
$ProjectName = Read-Host "Please enter a project name" |
|
} |
|
|
|
if ([string]::IsNullOrWhiteSpace($ProjectName)) { |
|
Write-Host "β Name required." -ForegroundColor Red; exit 1 |
|
} |
|
|
|
if (Test-Path $ProjectName) { |
|
Write-Host "β Directory '$ProjectName' already exists. Aborting to prevent overwrite." -ForegroundColor Red; exit 1 |
|
} |
|
|
|
$SlnFile = "$ProjectName.$Format" |
|
Write-Host "π Scaffolding Clean Architecture for: $ProjectName" -ForegroundColor Cyan |
|
|
|
# Create Root Directory |
|
New-Item -ItemType Directory -Path $ProjectName | Out-Null |
|
Set-Location $ProjectName |
|
|
|
# --- 2. Smart SDK Detection --- |
|
$LatestSdk = dotnet --list-sdks | Select-Object -Last 1 | ForEach-Object { $_.Split(' ')[0] } |
|
|
|
if ($LatestSdk) { |
|
Write-Host "βΉοΈ Detected SDK: $LatestSdk. Pinning global.json..." -ForegroundColor Gray |
|
dotnet new globaljson --sdk-version $LatestSdk --roll-forward latestFeature |
|
} else { |
|
Write-Host "β οΈ No SDK detected. Skipping global.json." -ForegroundColor Yellow |
|
} |
|
|
|
dotnet new gitignore |
|
|
|
# --- 3. Create Solution --- |
|
if ($Format -eq "slnx") { dotnet new sln -n $ProjectName --format slnx } |
|
else { dotnet new sln -n $ProjectName } |
|
|
|
# --- 4. Create Projects (Src & Tests) --- |
|
Write-Host "π¨ Creating projects..." -ForegroundColor Cyan |
|
|
|
# Source Projects |
|
dotnet new classlib -n "$ProjectName.Core" -o "src/$ProjectName.Core" |
|
dotnet new classlib -n "$ProjectName.Application" -o "src/$ProjectName.Application" |
|
dotnet new classlib -n "$ProjectName.Infrastructure" -o "src/$ProjectName.Infrastructure" |
|
dotnet new webapi -n "$ProjectName.Api" -o "src/$ProjectName.Api" --use-controllers |
|
|
|
# Test Projects |
|
dotnet new xunit -n "$ProjectName.Core.Tests" -o "tests/$ProjectName.Core.Tests" |
|
dotnet new xunit -n "$ProjectName.Application.Tests" -o "tests/$ProjectName.Application.Tests" |
|
dotnet new xunit -n "$ProjectName.IntegrationTests" -o "tests/$ProjectName.IntegrationTests" |
|
|
|
# --- 5. Add to Solution --- |
|
Write-Host "π Organizing solution structure..." -ForegroundColor Cyan |
|
|
|
# Add Src |
|
dotnet sln $SlnFile add "src/$ProjectName.Core/$ProjectName.Core.csproj" -s "src" |
|
dotnet sln $SlnFile add "src/$ProjectName.Application/$ProjectName.Application.csproj" -s "src" |
|
dotnet sln $SlnFile add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" -s "src" |
|
dotnet sln $SlnFile add "src/$ProjectName.Api/$ProjectName.Api.csproj" -s "src" |
|
|
|
# Add Tests |
|
dotnet sln $SlnFile add "tests/$ProjectName.Core.Tests/$ProjectName.Core.Tests.csproj" -s "tests" |
|
dotnet sln $SlnFile add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" -s "tests" |
|
dotnet sln $SlnFile add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" -s "tests" |
|
|
|
# --- 6. Add References --- |
|
Write-Host "π Wiring up dependencies..." -ForegroundColor Cyan |
|
|
|
# Application -> Core |
|
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Core/$ProjectName.Core.csproj" |
|
|
|
# Infrastructure -> Application & Core |
|
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj" |
|
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Core/$ProjectName.Core.csproj" |
|
|
|
# API -> Application & Infrastructure |
|
dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj" |
|
dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" |
|
|
|
# Tests |
|
dotnet add "tests/$ProjectName.Core.Tests/$ProjectName.Core.Tests.csproj" reference "src/$ProjectName.Core/$ProjectName.Core.csproj" |
|
dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj" |
|
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Api/$ProjectName.Api.csproj" |
|
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" |
|
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj" |
|
|
|
# --- 7. Install Nuget Packages (Optional) --- |
|
if (-not $SkipPackages) { |
|
Write-Host "π¦ Installing standard Clean Architecture packages..." -ForegroundColor Cyan |
|
|
|
# Application Layer |
|
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" package MediatR |
|
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" package FluentValidation |
|
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" package FluentValidation.DependencyInjectionExtensions |
|
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" package Microsoft.Extensions.Logging.Abstractions |
|
|
|
# Infrastructure Layer |
|
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" package Microsoft.EntityFrameworkCore |
|
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" package Microsoft.EntityFrameworkCore.SqlServer |
|
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" package Microsoft.EntityFrameworkCore.Design |
|
|
|
# API Layer |
|
dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" package Microsoft.EntityFrameworkCore.Tools |
|
|
|
# Test Projects |
|
$TestProjects = @( |
|
"tests/$ProjectName.Core.Tests/$ProjectName.Core.Tests.csproj", |
|
"tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj", |
|
"tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" |
|
) |
|
foreach ($proj in $TestProjects) { |
|
dotnet add $proj package FluentAssertions |
|
dotnet add $proj package Moq |
|
} |
|
|
|
# Integration Test Specifics |
|
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" package Microsoft.AspNetCore.Mvc.Testing |
|
} |
|
|
|
Write-Host "β
$ProjectName scaffolded successfully!" -ForegroundColor Green |
|
Write-Host " π cd $ProjectName" -ForegroundColor Gray |
|
Write-Host " π dotnet build" -ForegroundColor Gray |