weehong a révisé ce gist 5 hours ago. Aller à la révision
Aucun changement
weehong a révisé ce gist 5 hours ago. Aller à la révision
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 a révisé ce gist 5 hours ago. Aller à la révision
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 a révisé ce gist 6 hours ago. Aller à la révision
4 files changed, 599 insertions
README.md(fichier créé)
| @@ -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(fichier créé)
| @@ -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(fichier créé)
| @@ -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(fichier créé)
| @@ -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 | |