README.md
· 767 B · Markdown
Eredeti
## How to use
### 🍎 Linux / macOS
Run the following command in your terminal. Replace `MyProjectName` with your desired solution name.
```bash
# Syntax: curl [url] | bash -s -- [ProjectName]
curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.sh | bash -s -- MyCleanApp
bash -c "$(curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold_install.sh)"
```
### 🪟 Windows (PowerShell)
Run this command to scaffold the solution.
```powershell
# Syntax: irm [url] | % { & ([scriptblock]::Create($_)) [ProjectName] }
irm "https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
```
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://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.sh | bash -s -- MyCleanApp
bash -c "$(curl -fsSL https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold_install.sh)"
🪟 Windows (PowerShell)
Run this command to scaffold the solution.
# Syntax: irm [url] | % { & ([scriptblock]::Create($_)) [ProjectName] }
irm "https://gist.githubusercontent.com/weehong-1/69b63249165a4373204e82c88b211a78/raw/scaffold.ps1" | % { & ([scriptblock]::Create($_)) Tidverse }
scaffold.sh
· 9.7 KiB · Bash
Eredeti
#!/bin/bash
# --- 0. Determine Project Name ---
# Grab the name of the current directory
PROJECT_NAME=$(basename "$PWD")
echo "📂 Using current directory name as project name: $PROJECT_NAME"
# --- 1. Configuration ---
FORMAT="slnx" # Options: "sln" or "slnx"
INSTALL_PACKAGES=true # Set to true to install NuGet packages
echo "🚀 Initializing $PROJECT_NAME (Format: $FORMAT)..."
# --- 1.5 Database Selection ---
echo ""
echo "🗄️ Select your Database Provider for $PROJECT_NAME:"
echo " 1) PostgreSQL (Npgsql) [Default]"
echo " 2) SQL Server"
echo " 3) SQLite"
# < /dev/tty allows interactive prompt when piping via curl
read -p "Enter choice [1-3] (Default: 1): " DB_CHOICE < /dev/tty
case $DB_CHOICE in
2)
DB_PACKAGE="Microsoft.EntityFrameworkCore.SqlServer"
echo " Selected: SQL Server"
;;
3)
DB_PACKAGE="Microsoft.EntityFrameworkCore.Sqlite"
echo " Selected: SQLite"
;;
*)
DB_PACKAGE="Npgsql.EntityFrameworkCore.PostgreSQL"
echo " Selected: PostgreSQL"
;;
esac
echo ""
# --- 2. Smart SDK Detection ---
# Get the latest installed SDK version
LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
if [ -n "$LATEST_SDK" ]; then
echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
else
echo "⚠️ No SDK detected. Skipping global.json."
fi
dotnet new gitignore
# --- 3. Create Solution & Fix NuGet ---
if [ "$FORMAT" = "slnx" ]; then
echo "📄 Creating .slnx solution..."
dotnet new sln -n "$PROJECT_NAME" --format slnx
SLN_FILE="$PROJECT_NAME.slnx"
else
echo "📄 Creating standard .sln solution..."
dotnet new sln -n "$PROJECT_NAME"
SLN_FILE="$PROJECT_NAME.sln"
fi
# Create a local nuget.config to ensure we can find packages
echo "📦 Configuring NuGet sources..."
dotnet new nugetconfig --force
# Check if nuget.org is already there, if not, add it
if ! dotnet nuget list source --configfile "nuget.config" | grep -q "nuget.org"; then
dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
fi
# --- 4. Create Projects ---
echo "🔨 Creating projects..."
dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain"
dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
mkdir -p tests
dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests"
dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
# --- 4.1 CLEANUP BOILERPLATE ---
echo "🧹 Removing default template files..."
FILES_TO_REMOVE=(
"src/$PROJECT_NAME.Shared/Class1.cs"
"src/$PROJECT_NAME.Domain/Class1.cs"
"src/$PROJECT_NAME.Application/Class1.cs"
"src/$PROJECT_NAME.Infrastructure/Class1.cs"
"tests/$PROJECT_NAME.Domain.Tests/UnitTest1.cs"
"tests/$PROJECT_NAME.Application.Tests/UnitTest1.cs"
"tests/$PROJECT_NAME.IntegrationTests/UnitTest1.cs"
"src/$PROJECT_NAME.Api/WeatherForecast.cs"
"src/$PROJECT_NAME.Api/Controllers/WeatherForecastController.cs"
"src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.http"
)
for file in "${FILES_TO_REMOVE[@]}"; do
if [ -f "$file" ]; then
rm "$file"
echo " - Deleted $file"
fi
done
# --- 5. Add to Solution (With Visual Folders) ---
echo "📂 Organizing solution structure in $SLN_FILE..."
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests"
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
# --- 6. Add References ---
echo "🔗 Wiring up dependencies..."
# Shared References
dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
# Clean Architecture Flow
dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
# Test References
dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj"
# --- 7. Install Nuget Packages (Optional) ---
if [ "$INSTALL_PACKAGES" = true ]; then
echo "📦 Installing standard Clean Architecture packages..."
add_package() {
local proj=$1
local pkg=$2
echo " + Adding $pkg..."
dotnet add "$proj" package "$pkg" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo " ⚠️ Failed to add $pkg. Check connection."
fi
}
# Application Layer
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "MediatR"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
# Infrastructure Layer
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "$DB_PACKAGE"
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
# API Layer
add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Serilog.AspNetCore"
# Test Projects
TEST_PROJECTS=(
"tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj"
"tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj"
"tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj"
)
for proj in "${TEST_PROJECTS[@]}"; do
add_package "$proj" "FluentAssertions"
add_package "$proj" "Moq"
done
add_package "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
fi
# --- 8. Final Verification ---
echo "🏗️ Verifying build..."
dotnet build
if [ $? -eq 0 ]; then
echo "✅ $PROJECT_NAME scaffolded successfully!"
else
echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
fi
| 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
· 9.3 KiB · PowerShell
Eredeti
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 (DDD) 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
}
dotnet new gitignore
# --- 3. Create Solution & Fix NuGet ---
if ($Format -eq "slnx") { dotnet new sln -n $ProjectName --format slnx }
else { dotnet new sln -n $ProjectName }
Write-Host "📦 Configuring NuGet sources..." -ForegroundColor Cyan
dotnet new nugetconfig --force
$CurrentSources = dotnet nuget list source --configfile "nuget.config"
if ($CurrentSources -notmatch "nuget.org") {
dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
}
# --- 4. Create Projects ---
Write-Host "🔨 Creating projects..." -ForegroundColor Cyan
# Source Projects
dotnet new classlib -n "$ProjectName.Shared" -o "src/$ProjectName.Shared"
dotnet new classlib -n "$ProjectName.Domain" -o "src/$ProjectName.Domain" # <--- CHANGED
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.Domain.Tests" -o "tests/$ProjectName.Domain.Tests" # <--- CHANGED
dotnet new xunit -n "$ProjectName.Application.Tests" -o "tests/$ProjectName.Application.Tests"
dotnet new xunit -n "$ProjectName.IntegrationTests" -o "tests/$ProjectName.IntegrationTests"
# --- 4.1 CLEANUP BOILERPLATE ---
Write-Host "🧹 Removing default template files..." -ForegroundColor Cyan
$FilesToRemove = @(
"src/$ProjectName.Shared/Class1.cs",
"src/$ProjectName.Domain/Class1.cs", # <--- CHANGED
"src/$ProjectName.Application/Class1.cs",
"src/$ProjectName.Infrastructure/Class1.cs",
"tests/$ProjectName.Domain.Tests/UnitTest1.cs", # <--- CHANGED
"tests/$ProjectName.Application.Tests/UnitTest1.cs",
"tests/$ProjectName.IntegrationTests/UnitTest1.cs",
"src/$ProjectName.Api/WeatherForecast.cs",
"src/$ProjectName.Api/Controllers/WeatherForecastController.cs",
"src/$ProjectName.Api/$ProjectName.Api.http"
)
foreach ($File in $FilesToRemove) {
if (Test-Path $File) {
Remove-Item $File -Force
}
}
# --- 5. Add to Solution ---
Write-Host "📂 Organizing solution structure..." -ForegroundColor Cyan
# Add Src
dotnet sln $SlnFile add "src/$ProjectName.Shared/$ProjectName.Shared.csproj" -s "src"
dotnet sln $SlnFile add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" -s "src" # <--- CHANGED
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.Domain.Tests/$ProjectName.Domain.Tests.csproj" -s "tests" # <--- CHANGED
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
# Shared References (Utility/Kernel)
dotnet add "src/$ProjectName.Domain/$ProjectName.Domain.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
dotnet add "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
dotnet add "src/$ProjectName.Api/$ProjectName.Api.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
# Application -> Domain
dotnet add "src/$ProjectName.Application/$ProjectName.Application.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
# Infrastructure -> Application & Domain
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.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
# 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.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- CHANGED
dotnet add "tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj" # <--- CHANGED
dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Application/$ProjectName.Application.csproj"
dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
# NOTE: Application tests usually need Domain too for entities
dotnet add "tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
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"
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Shared/$ProjectName.Shared.csproj"
dotnet add "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" reference "src/$ProjectName.Domain/$ProjectName.Domain.csproj" # <--- ADDED
# --- 7. Install Nuget Packages (Optional) ---
if (-not $SkipPackages) {
Write-Host "📦 Installing standard Clean Architecture packages..." -ForegroundColor Cyan
function Add-Package {
param ($Project, $Package)
Write-Host " + Adding $Package..." -ForegroundColor Gray
dotnet add $Project package $Package
}
# Application Layer
Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "MediatR"
Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "FluentValidation"
Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
Add-Package "src/$ProjectName.Application/$ProjectName.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
# Infrastructure Layer
Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.SqlServer"
Add-Package "src/$ProjectName.Infrastructure/$ProjectName.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
# API Layer
Add-Package "src/$ProjectName.Api/$ProjectName.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
# Test Projects
$TestProjects = @(
"tests/$ProjectName.Domain.Tests/$ProjectName.Domain.Tests.csproj", # <--- CHANGED
"tests/$ProjectName.Application.Tests/$ProjectName.Application.Tests.csproj",
"tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj"
)
foreach ($proj in $TestProjects) {
Add-Package $proj "FluentAssertions"
Add-Package $proj "Moq"
}
Add-Package "tests/$ProjectName.IntegrationTests/$ProjectName.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
}
# --- 8. Final Verification ---
Write-Host "🏗️ Verifying build..." -ForegroundColor Cyan
dotnet build
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ $ProjectName scaffolded successfully!" -ForegroundColor Green
Write-Host " 👉 cd $ProjectName" -ForegroundColor Gray
}
| 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
· 9.6 KiB · Bash
Eredeti
#!/bin/bash
# Usage: ./scaffold.sh MyProjectName [slnx|sln] [true|false for packages]
# Example: ./scaffold.sh MyCleanApp slnx
# --- 1. Setup & Validation ---
if [ -z "$1" ]; then
echo "❌ Please provide a project name."
echo "Usage: ./scaffold.sh MyProjectName [slnx|sln]"
exit 1
fi
PROJECT_NAME=$1
FORMAT=${2:-slnx}
INSTALL_PACKAGES=${3:-true} # Default to true
SLN_FILE="$PROJECT_NAME.$FORMAT"
# Check if directory exists to avoid overwriting
if [ -d "$PROJECT_NAME" ]; then
echo "❌ Directory '$PROJECT_NAME' already exists. Aborting."
exit 1
fi
echo "🚀 Scaffolding $FORMAT solution for: $PROJECT_NAME (Clean Architecture + DDD)"
# Create Root Directory and enter it
mkdir "$PROJECT_NAME"
cd "$PROJECT_NAME" || exit
# --- 2. Smart SDK Detection ---
# Get the latest installed SDK version (e.g. 10.0.102)
LATEST_SDK=$(dotnet --list-sdks | tail -n 1 | awk '{print $1}')
if [ -n "$LATEST_SDK" ]; then
echo "ℹ️ Detected SDK: $LATEST_SDK. Pinning global.json..."
dotnet new globaljson --sdk-version "$LATEST_SDK" --roll-forward latestFeature
else
echo "⚠️ No SDK detected. Skipping global.json."
fi
dotnet new gitignore
# --- 3. Create Solution & Fix NuGet ---
if [ "$FORMAT" == "slnx" ]; then
dotnet new sln -n "$PROJECT_NAME" --format slnx
else
dotnet new sln -n "$PROJECT_NAME"
fi
# [FIX] Create a local nuget.config to ensure we can find packages
echo "📦 Configuring NuGet sources..."
dotnet new nugetconfig --force
# Check if nuget.org is already there
if ! dotnet nuget list source --configfile "nuget.config" | grep -q "nuget.org"; then
dotnet nuget add source "https://api.nuget.org/v3/index.json" -n "nuget.org" --configfile "nuget.config"
fi
# --- 4. Create Projects ---
echo "🔨 Creating projects..."
dotnet new classlib -n "$PROJECT_NAME.Shared" -o "src/$PROJECT_NAME.Shared"
dotnet new classlib -n "$PROJECT_NAME.Domain" -o "src/$PROJECT_NAME.Domain" # <--- CHANGED
dotnet new classlib -n "$PROJECT_NAME.Application" -o "src/$PROJECT_NAME.Application"
dotnet new classlib -n "$PROJECT_NAME.Infrastructure" -o "src/$PROJECT_NAME.Infrastructure"
dotnet new webapi -n "$PROJECT_NAME.Api" -o "src/$PROJECT_NAME.Api" --use-controllers
mkdir -p tests
dotnet new xunit -n "$PROJECT_NAME.Domain.Tests" -o "tests/$PROJECT_NAME.Domain.Tests" # <--- CHANGED
dotnet new xunit -n "$PROJECT_NAME.Application.Tests" -o "tests/$PROJECT_NAME.Application.Tests"
dotnet new xunit -n "$PROJECT_NAME.IntegrationTests" -o "tests/$PROJECT_NAME.IntegrationTests"
# --- 4.1 CLEANUP BOILERPLATE ---
echo "🧹 Removing default template files..."
# Define array of files to remove relative to solution root
FILES_TO_REMOVE=(
"src/$PROJECT_NAME.Shared/Class1.cs"
"src/$PROJECT_NAME.Domain/Class1.cs" # <--- CHANGED
"src/$PROJECT_NAME.Application/Class1.cs"
"src/$PROJECT_NAME.Infrastructure/Class1.cs"
"tests/$PROJECT_NAME.Domain.Tests/UnitTest1.cs" # <--- CHANGED
"tests/$PROJECT_NAME.Application.Tests/UnitTest1.cs"
"tests/$PROJECT_NAME.IntegrationTests/UnitTest1.cs"
"src/$PROJECT_NAME.Api/WeatherForecast.cs"
"src/$PROJECT_NAME.Api/Controllers/WeatherForecastController.cs"
"src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.http"
)
for file in "${FILES_TO_REMOVE[@]}"; do
if [ -f "$file" ]; then
rm "$file"
echo " - Deleted $file"
fi
done
# --- 5. Add to Solution (With Visual Folders) ---
echo "📂 Organizing solution structure..."
# Source
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" -s "src" # <--- CHANGED
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" -s "src"
dotnet sln "$SLN_FILE" add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" -s "src"
# Tests
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" -s "tests" # <--- CHANGED
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" -s "tests"
dotnet sln "$SLN_FILE" add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" -s "tests"
# --- 6. Add References ---
echo "🔗 Wiring up dependencies..."
# Shared References (Utility/Kernel)
dotnet add "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
# Application -> Domain
dotnet add "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
# Infrastructure -> Application AND Domain
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
# API -> Application AND Infrastructure
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
# Tests
dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- CHANGED
dotnet add "tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj" # <--- CHANGED
dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
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)
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Shared/$PROJECT_NAME.Shared.csproj"
dotnet add "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" reference "src/$PROJECT_NAME.Domain/$PROJECT_NAME.Domain.csproj" # <--- ADDED
# --- 7. Install Nuget Packages (Optional) ---
if [ "$INSTALL_PACKAGES" = true ]; then
echo "📦 Installing standard Clean Architecture packages..."
# Helper function to add packages safely
add_package() {
local proj=$1
local pkg=$2
echo " + Adding $pkg..."
dotnet add "$proj" package "$pkg" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo " ⚠️ Failed to add $pkg. Check connection."
fi
}
# Application Layer
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "MediatR"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "FluentValidation.DependencyInjectionExtensions"
add_package "src/$PROJECT_NAME.Application/$PROJECT_NAME.Application.csproj" "Microsoft.Extensions.Logging.Abstractions"
# Infrastructure Layer
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore"
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.SqlServer"
add_package "src/$PROJECT_NAME.Infrastructure/$PROJECT_NAME.Infrastructure.csproj" "Microsoft.EntityFrameworkCore.Design"
# API Layer
add_package "src/$PROJECT_NAME.Api/$PROJECT_NAME.Api.csproj" "Microsoft.EntityFrameworkCore.Tools"
# Tests
TEST_PROJECTS=(
"tests/$PROJECT_NAME.Domain.Tests/$PROJECT_NAME.Domain.Tests.csproj" # <--- CHANGED
"tests/$PROJECT_NAME.Application.Tests/$PROJECT_NAME.Application.Tests.csproj"
"tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj"
)
for proj in "${TEST_PROJECTS[@]}"; do
add_package "$proj" "FluentAssertions"
add_package "$proj" "Moq"
done
add_package "tests/$PROJECT_NAME.IntegrationTests/$PROJECT_NAME.IntegrationTests.csproj" "Microsoft.AspNetCore.Mvc.Testing"
fi
# --- 8. Final Verification ---
echo "🏗️ Verifying build..."
dotnet build
if [ $? -eq 0 ]; then
echo "✅ $PROJECT_NAME scaffolded successfully!"
echo "👉 cd $PROJECT_NAME"
else
echo "⚠️ Scaffolding finished, but build failed. Run 'dotnet restore' manually."
fi
| 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 |