# 📦 Proto & gRPC Complete Guide > **آخرین بروزرسانی**: January 3, 2026 > **NuGet Server**: GitLab Package Registry > **URL جدید**: `https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json` --- ## 📊 معماری Packaging ``` ┌─────────────────────────────────────────────────────────────┐ │ LAYER 1: CMS Proto (Base) │ │ CMSMicroservice.Protobuf │ │ Version: 0.0.142+ → Auto-push به GitLab │ └─────────────────────────────────────────────────────────────┘ │ PackageReference ▼ ┌─────────────────────────────────────────────────────────────┐ │ LAYER 2: BFF Protos │ │ BackOffice.BFF.*.Protobuf (24 packages) │ │ FrontOffice.BFF.*.Protobuf (packages) │ │ → Depend on: CMS Proto v0.0.x │ └─────────────────────────────────────────────────────────────┘ │ PackageReference / DLL Reference ▼ ┌─────────────────────────────────────────────────────────────┐ │ LAYER 3: UI Applications │ │ BackOffice UI → libs/*.dll (24 DLLs) │ │ FrontOffice UI → FrontOffice.BFF Protos │ └─────────────────────────────────────────────────────────────┘ ``` --- ## ⚠️ قانون طلایی **هر تغییر در Proto = این 3 مرحله اجباری:** ```bash # 1️⃣ افزایش Version X.Y.ZX.Y.Z+1 # 2️⃣ Pack کردن dotnet pack -c Release # ✅ خودکار push می‌شه به GitLab # 3️⃣ Update در لایه بالاتر ``` --- ## 🔧 روش‌های Reference در BackOffice ### روش 1: DLL Reference (Production/CI-CD) ✅ پیشنهادی **مزایا**: مستقل از ریپوی BFF، مناسب CI/CD ```bash # Build proto DLLs cd BackOffice ./build-deps.sh # DLLs در libs/ قرار می‌گیرند ls libs/*.dll | wc -l # 24 DLL ``` **BackOffice.csproj**: ```xml ../../libs/BackOffice.BFF.Common.Protobuf.dll ``` --- ### روش 2: ProjectReference (Development) **مزایا**: تغییرات بلافاصله اعمال می‌شود ```xml ``` --- ### روش 3: PackageReference (قدیمی) **مزایا**: کنترل دقیق ورژن ```xml ``` **معایب**: نیاز به push به NuGet server --- ## 📝 اسکریپت build-deps.sh **مسیر**: `/home/masoud/Apps/project/FourSat/BackOffice/build-deps.sh` ```bash #!/bin/bash # Build all BFF proto dependencies and copy DLLs to libs folder set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LIBS_DIR="$SCRIPT_DIR/libs" BFF_PROTOS_DIR="$SCRIPT_DIR/../BackOffice.BFF/src/Protobufs" echo "🔧 Building all proto dependencies..." mkdir -p "$LIBS_DIR" # All 24 proto projects PROTO_PROJECTS=( "BackOffice.BFF.Common.Protobuf" "BackOffice.BFF.Category.Protobuf" # ... (complete list) ) for PROJECT in "${PROTO_PROJECTS[@]}"; do PROJECT_DIR="$BFF_PROTOS_DIR/$PROJECT" dotnet build "$PROJECT_DIR" -c Release --verbosity quiet # Check both net9.0 and net8.0 if [ -f "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" ]; then cp "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" "$LIBS_DIR/" elif [ -f "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" ]; then cp "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" "$LIBS_DIR/" fi done echo "✅ Build complete! Total DLLs: $(ls $LIBS_DIR/*.dll | wc -l)" ``` --- ## 🚀 Workflow توسعه ### Development (Local): ```bash # Build با Debug config cd BackOffice/src dotnet build -c Debug # اگر libs/ نباشد → از ProjectReference استفاده می‌شود # تغییرات Proto بلافاصله اعمال می‌شود ``` ### Production (Deploy): ```bash # 1. Build proto DLLs cd BackOffice ./build-deps.sh # 2. Build & Publish cd src dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish # 3. بررسی output ls ./publish/wwwroot/_framework/*.wasm | grep "BackOffice.BFF" | wc -l # Result: 24 ✅ ``` --- ## 📦 لیست Proto Projects ### BackOffice.BFF (24 پروژه) | پروژه | Target Framework | وضعیت | |-------|------------------|--------| | BackOffice.BFF.Common.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Category.Protobuf | net9.0 | ✅ | | BackOffice.BFF.ClubMembership.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Commission.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Configuration.Protobuf | net9.0 | ✅ | | BackOffice.BFF.DiscountCategory.Protobuf | net9.0 | ✅ | | BackOffice.BFF.DiscountOrder.Protobuf | net9.0 | ✅ | | BackOffice.BFF.DiscountProduct.Protobuf | net9.0 | ✅ | | BackOffice.BFF.DiscountShoppingCart.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Health.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Inventory.Protobuf | net9.0 | ✅ | | BackOffice.BFF.ManualPayment.Protobuf | net9.0 | ✅ | | BackOffice.BFF.NetworkMembership.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Otp.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Package.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Products.Protobuf | net9.0 | ✅ | | BackOffice.BFF.ProductTag.Protobuf | net9.0 | ✅ | | BackOffice.BFF.PublicMessage.Protobuf | **net8.0** | ✅ | | BackOffice.BFF.Role.Protobuf | net9.0 | ✅ | | BackOffice.BFF.Tag.Protobuf | net9.0 | ✅ | | BackOffice.BFF.User.Protobuf | net9.0 | ✅ | | BackOffice.BFF.UserAddress.Protobuf | net9.0 | ✅ | | BackOffice.BFF.UserOrder.Protobuf | net9.0 | ✅ | | BackOffice.BFF.UserRole.Protobuf | net9.0 | ✅ | ⚠️ **نکته**: `PublicMessage.Protobuf` تنها پروژه با `net8.0` است --- ## 🔧 تنظیمات csproj با Auto-Push ```xml net9.0 Foursat.BackOffice.BFF.Products.Protobuf 1.0.0 FourSat FourSat true ./nupkg $(PackageOutputPath)$(PackageId).$(Version).nupkg dotnet nuget push **/*.nupkg --source https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json --api-key YOUR_API_KEY --skip-duplicate ``` --- ## 🛠️ Troubleshooting ### مشکل: Version Conflict **علامت**: ``` error NU1605: Detected package downgrade: Grpc.Core.Api from 2.71.0 to 2.54.0 ``` **راه‌حل**: ```xml ``` --- ### مشکل: Missing Transitive Dependencies **علامت**: ``` CS0234: The type or namespace name 'Google' does not exist ``` **راه‌حل**: اضافه کردن dependencies در csproj: ```xml ``` --- ### مشکل: DLL Not Found **علامت**: ``` warning MSB3245: Could not resolve this reference ``` **راه‌حل**: ```bash # Rebuild all proto DLLs cd BackOffice rm -rf libs/ ./build-deps.sh ``` --- ### مشکل: net8.0 vs net9.0 **علامت**: DLL یک پروژه کپی نشده **راه‌حل**: اسکریپت `build-deps.sh` هر دو framework را چک می‌کند --- ## 📚 مراجع - [gRPC for .NET](https://docs.microsoft.com/en-us/aspnet/core/grpc/) - [Protocol Buffers](https://developers.google.com/protocol-buffers) - [NuGet CLI Reference](https://docs.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference)