sccache - ذاكرة التجميع المشتركة
sccache هي ذاكرة مجمع (بروح ccache) من Mozilla التي تدعم Rust و C/C++ و NVCC. تلتف مجمعك، تجزئة المدخلات، وتعيد كائن مخزن مؤقتًا عندما تكون قد رأت نفس التجميع من قبل. ميزتها المميزة هي محركات التخزين المشتركة — S3 و GCS و Redis و Azure — بحيث يشارك الفريق بأكمله وأسطول CI الخاص بك ذاكرة واحدة. هذا يحول “CI تعيد تجميع كل شيء من الصفر في كل تشغيل” إلى “CI تحمل ما تم بناؤه بالفعل.”
التثبيت
| الطريقة | الأمر |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| ملف ثنائي | تحميل من GitHub Releases |
| التحقق | sccache --version |
استخدامه مع Rust
# لمرة واحدة
RUSTC_WRAPPER=sccache cargo build
# دائم (في ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
| المتغير | الغرض |
|---|
RUSTC_WRAPPER=sccache | توجيه rustc عبر sccache |
SCCACHE_DIR | دليل ذاكرة محلية |
SCCACHE_CACHE_SIZE | حد أقصى لحجم الذاكرة المحلية (مثل 20G) |
استخدامه مع C/C++
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
فحص الفعالية
| الأمر | يعرض |
|---|
sccache --show-stats | الضربات والفشل وحجم الذاكرة والأخطاء |
sccache --zero-stats | إعادة تعيين العدادات قبل بناء الاختبار |
sccache --stop-server | إيقاف خادم الخلفية |
sccache --start-server | ابدأه بشكل صريح |
# قياس بناء بارد مقابل دافئ
sccache --zero-stats
cargo build --release
sccache --show-stats # expect misses
cargo clean && cargo build --release
sccache --show-stats # expect hits
الرقم الرئيسي هو معدل ضربة الذاكرة. معدل منخفض عادة يعني أن شيئًا ما في المدخلات يتغير (أعلام، متغيرات بيئية، مسارات مطلقة).
محركات السحابة المشتركة
# S3
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
# Redis
export SCCACHE_REDIS=redis://cache.internal:6379
# GCS
export SCCACHE_GCS_BUCKET=my-build-cache
export SCCACHE_GCS_KEY_PATH=/path/to/key.json
| المحرك | بادئة Env |
|---|
| القرص المحلي | SCCACHE_DIR |
| S3 / S3-متوافق | SCCACHE_BUCKET, SCCACHE_ENDPOINT |
| Redis | SCCACHE_REDIS |
| GCS | SCCACHE_GCS_* |
| Azure | SCCACHE_AZURE_* |
| GitHub Actions | SCCACHE_GHA_ENABLED=true |
نمط CI
# GitHub Actions
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: mozilla-actions/sccache-action@v0.0.5
- run: cargo build --release
- run: sccache --show-stats
ما يكسر الذاكرة المؤقتة
| السبب | الحل |
|---|
| مسارات مطلقة في الإخراج | استخدم --remap-path-prefix |
تغيير RUSTFLAGS | احفظ الأعلام المستقرة عبر التشغيلات |
| التجميع المتزايد | عطّله (CARGO_INCREMENTAL=0) لاستخدام الذاكرة |
| وحدات الماكرو / سكريبتات البناء | ليس دائمًا قابلة للتخزين المؤقت |
| إصدارات مجمع مختلفة | تتضمن مفاتيح الذاكرة المجمع |
sccache مقابل البدائل
| الجانب | sccache | ccache | Bazel/Buck |
|---|
| اللغات | Rust, C/C++, CUDA | C/C++ | كثير (نظام بناء كامل) |
| ذاكرة مشتركة | محركات سحابة مدمجة | معظمها محلي | ذاكرة/تنفيذ عن بعد |
| الإعداد | متغير بيئة محول | محول | اعتماد نظام بناء جديد |
| الأفضل لـ | تسريع الأبنية الموجودة | تخزين C/C++ محلي | أحادي كبيرة |
يقترن بشكل جيد مع mold — sccache يقطع وقت التجميع، mold يقطع وقت الربط.
الموارد