يوضّح لك هذا الدليل كيفية نقل إضافاتك من بيئة Firebase Extensions المتوقّفة نهائيًا إلى حزمة دوال يمكنك تثبيتها ونشرها في Cloud Functions الخاص بك لرمز قاعدة Firebase (الجيل الثاني).
Firebase Extensions إدارة جميع جوانب إنشاء الإضافات وتعديلها وإزالتها تتضمّن حِزم الدوال إمكانات الإضافات على شكل Cloud Functions for Firebase نموذجية من الجيل الثاني. بما أنّ حِزم الدوال هي حِزم عادية Cloud Functions، يمكنك إنشاء هذه الحِزم وتعديلها وحذفها وتحديد المشاكل فيها باستخدام أداة Firebase CLI ضمن مشروع Firebase. يهدف هذا الدليل إلى إعدادك لإدارة وظائفك الآن واستخدام التحديثات عند توفّرها.
في هذا الدليل، يتم استخدام الإضافة Stream Cloud Firestore to BigQuery (firestore-bigquery-export) كمثال يوضّح لك الأوامر ونتائج الأوامر لكل خطوة من خطوات نقل البيانات.
تحديد مسار نقل البيانات
تشجّع Firebase جميع ناشري Firebase Extensions على إنشاء بدائل لإضافاتهم على شكل حِزم وظائف منشورة على npm. يمكنك التحقّق مما إذا كان هناك بديل لمجموعة وظائف متاحة لإضافاتك بعدة طرق مختلفة:
- انتقِل إلى صفحة "الإضافات" في Firebase console لمشروعك. تشير كل إضافة مثبَّتة إلى ما إذا كان يتوفّر لها بديل من حزمة وظائف.
نفِّذ الأمر
firebase ext:listداخل مشروع Firebase في نافذة طرفية لعرض الإضافات المثبَّتة التي تتوفّر لها بدائل رسمية:firebase ext:list --project my-projecti extensions: ensuring required API firebaseextensions.googleapis.com is enabled... ✔ extensions: required API firebaseextensions.googleapis.com is enabled i extensions: list of extensions installed in my-project: ┌────────────────────────────────────┬───────────┬────────────────────────────────┬────────┬─────────┬─────────────────────┬───────────────────────────────────────────────────┐ │ Extension │ Publisher │ Instance ID │ State │ Version │ Your last update │ Replacement Kit │ ├────────────────────────────────────┼───────────┼────────────────────────────────┼────────┼─────────┼─────────────────────┼───────────────────────────────────────────────────┤ │ firebase/firestore-bigquery-export │ firebase │ firestore-bigquery-export-zbrp │ ACTIVE │ 0.3.2 │ 2026-06-10 18:35:03 │ @firebase-function-kits/firestore-bigquery-export │ ├────────────────────────────────────┼───────────┼────────────────────────────────┼────────┼─────────┼─────────────────────┼───────────────────────────────────────────────────┤ │ firebase/storage-resize-images │ firebase │ storage-resize-images │ ACTIVE │ 0.3.6 │ 2026-06-03 17:41:24 │ │ └────────────────────────────────────┴───────────┴────────────────────────────────┴────────┴─────────┴─────────────────────┴───────────────────────────────────────────────────┘ ⚠ Notice: Firebase Extensions will shut down on March 31, 2027. Learn more: https://firebase.google.com/docs/extensions/faq-and-troubleshooting
إذا كان يتوفّر بديل رسمي لمجموعة الدوال الخاصة بالإضافة، يمكنك نقلها باستخدام القسم نقل البيانات إلى مجموعات الدوال على npm.
إذا لم تتمكّن من العثور على بديل منشور، يمكنك إنشاء نسخة من رمز الإضافة وتعديله لإنشاء بديل خاص بك، لأنّ جميع الإضافات مفتوحة المصدر. لإجراء ذلك، اتّبِع دليل الانتقال إلى حزمة أدوات وظائف تم إنشاؤها ذاتيًا.
| اختيار مسار نقل البيانات: | نقل البيانات إلى حِزم الدوال على npm نقل البيانات إلى حزمة دوال تم إنشاؤها ذاتيًا |
نقل حِزم الدوال إلى npm
التحقّق من القيود المعروفة المفروضة على عملية نقل البيانات
قبل البدء في نقل مثيل إضافة، تحقَّق ممّا إذا كان الإعداد يستخدم أيًا من الميزات التالية التي تتطلّب حلاً بديلاً أو غير متاحة بعد في حِزم الدوال:
- تتطلّب مستودعات Docker المخصّصة ومفاتيح KMS حلاً بديلاً يدويًا لا يتيح Cloud Functions for Firebase استبدال مَعلمات النظام لتكوين مستودع Docker مخصّص أو مفتاح تشفير يديره العميل (مفتاح KMS). إذا كان الإضافة تضبط أيًا من هاتين المَعلمتَين، يُرجى الرجوع إلى الحل البديل في الأسئلة الشائعة.
قبل البدء
عليك إعداد Firebase CLI وإعداد Firebase
مشروع. عند استخدام واجهة سطر الأوامر، تأكَّد من استخدام الإصدار firebase-tools من >= 15.32.0، الذي يتضمّن أوامر نقل البيانات الجديدة وأدوات الوظائف.
الأذونات والأدوار المطلوبة للحساب
استنادًا إلى ما يجب إنشاؤه وضبطه من خلال واجهة سطر الأوامر Firebase أثناء عملية النقل، يجب أن يتضمّن الحساب الذي تستخدمه للمصادقة باستخدام Firebase وGoogle Cloud الأدوار التالية:
roles/firebaseextensions.editorroles/cloudbuild.builds.editorroles/artifactregistry.writerroles/run.developerroles/iam.serviceAccountUserroles/iam.serviceAccountCreator-
roles/cloudfunctions.admin(إذا كنت بحاجة إلى تنفيذsetIamPermissionsلنقاط النهاية العامة) roles/secretmanager.admin(في حال استخدام الأسرار)roles/serviceusage.serviceUsageAdmin(في حال كنت بحاجة إلى تفعيل واجهات برمجة تطبيقات جديدة)
ننصحك باستخدام حساب سبق أن ثبّت إضافات ونشر وظائف، لأنّه من المحتمل أن تكون معظم هذه الأذونات قد تم منحها مسبقًا. إذا كان حسابك الذي يتم نقل بياناته بحاجة إلى المزيد من الأدوار، اتّبِع Google Cloud تعليمات إدارة الهوية وإمكانية الوصول لإضافتها.
اختيار سير عمل CLI
للانتقال من مثيل إضافة إلى حزمة دوال متاحة على npm، اختَر أحد الخيارَين التاليَين:
- (يُنصح به) يمكنك نقل البيانات باستخدام أمر
ext:migrateفي واجهة سطر الأوامر. ينشر هذا الأمر حزمة الدوال البديلة قبل إلغاء تثبيت الإضافة التي تحلّ محلّها. - يمكنك نقل البيانات باستخدام أوامر واجهة سطر الأوامر الخاصة بمجموعات الدوال. يمكنك استخدام أوامر منفصلة لتعديل الإضافة وتثبيت حزمة دوال وإعدادها مثل الإضافة ونشر الحزمة وإلغاء تثبيت الإضافة. ويوفّر ذلك مرونة أكبر في إعادة ترتيب الأوامر أو تنفيذ مهام إضافية بين الخطوات.
نقل البيانات باستخدام ext:migrate
ابدأ عملية نقل البيانات مرة واحدة لكل مثيل من الإضافة عن طريق تنفيذ ما يلي:
firebase ext:migrate --project <project-id>
يرشدك هذا الأمر خلال:
- اختيار إضافة لنقل البيانات تتوفّر لها حزمة وظائف رسمية بديلة
- اختيار مثيل معيّن من تلك الإضافة
- تحديث الإضافة إلى أحدث إصدار إذا لزم الأمر
- تثبيت حزمة الدوال، وإعداد نسخة طبق الأصل من طريقة إعداد نسخة الإضافة
- نشر حزمة الدوال
- التحقّق من أنّ حزمة الدوال تم نشرها بنجاح وأنّه تم تنفيذ جميع عمليات ربط دورة الحياة، إن وُجدت.
- إلغاء تثبيت نسخة الإضافة
إذا كنت تعرف الإضافة أو مثيل الإضافة المحدّد الذي تريد نقل بياناته، حدِّده باستخدام علامات سطر الأوامر التالية:
firebase ext:migrate --extension firebase/firestore-bigquery-export --project <project-id>
# or
firebase ext:migrate --ext-instance firestore-bigquery-export-abcd --project <project-id>
إذا كنت تعرف الحزمة المحدّدة التي تريد نقل بياناتك إليها، خاصةً إذا لم تكن حزمة بديلة رسمية مدرَجة من قِبل Google، حدِّدها باستخدام العلامة --package:
firebase ext:migrate --ext-instance firestore-bigquery-export-abcd --package @firebase-function-kits/firestore-bigquery-export --project <project-id>
تأكيد نشر مجموعة وظائف
للتحقّق من أنّ firebase deploy لم يتضمّن أي أخطاء، راجِع سجلّات النشر لمعرفة ما إذا تم تشغيل أي خطافات لدورة الحياة. تستخدم الإضافات الشائعة، مثل Stream Cloud Firestore إلى BigQuery، خطافات مراحل النشاط. في ما يلي مثال على شكل خطاف دورة الحياة عند تشغيله:
i functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔ functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project
تؤكّد رسائل السجلّ هذه ما يلي:
- تم العثور على خطاف دورة حياة وتنفيذه.
- تمت إضافة مهمة إلى قائمة انتظار المهام المرتبطة بخطاف دورة الحياة.
- تم توفير رابط إلى Cloud Logging حتى تتمكّن من التأكّد من أنّ المهمة اكتملت بدون أخطاء.
اتبع رابط السجلّات إلى وحدة تحكّم Google Cloud للتحقّق من عدم وجود أي أخطاء في السجلّات ومن أنّه تمت معالجة حدث قائمة انتظار المهام بنجاح. إذا لم يتم تنفيذ حدث يتم في مراحل النشاط بنجاح، يمكنك إعادة تشغيله من خلال تنفيذ ما يلي:
firebase functions:lifecycle:run <hook-name> <codebase>
إذا كنت بصدد نشر مثيل لحزمة دوال للمرة الأولى، نفِّذ ما يلي:
firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>
إذا أردت في أي وقت أثناء عملية التحقّق إيقاف عملية النقل هذه أو التراجع عنها، يمكنك إلغاء تثبيت الحزمة باتّباع التعليمات الواردة في مقالة إلغاء تثبيت الإضافة.
مراجعة ملف README الخاص بمجموعة الدوال
قد تتطلّب بعض الحِزم إجراءات إضافية بخلاف تلك التي يتم التعامل معها تلقائيًا من خلال حِزم الدوال. راجِع README للحزمة التي تريد تثبيتها واتّبِع أي تعليمات إضافية.
نقل البيانات باستخدام واجهة سطر الأوامر الخاصة بحِزم الدوال
قبل البدء، حدِّد واكتب معرّف مثيل الإضافة التي تريد نقلها إلى حزمة واسم حزمة npm البديلة. يمكنك العثور على كليهما باستخدام ناتج firebase ext:list. راجِع مقالة
تحديد مسار نقل البيانات للاطّلاع على مثال حول استخدام
ext:list.
1. ترقية مثيل الإضافة إلى أحدث إصدار
يجب تحديث الإضافة إلى أحدث إصدار لتقليل الفرق بين نسخة الإضافة وحزمة الاستبدال. إذا لم تتم ترقية الإضافة، قد تحدث تغييرات كبيرة غير متوافقة بين نسخة الإضافة واستبدالها بالحزمة. قد لا يتطابق الإعداد الذي تم تصديره مع ما تتوقّعه الحزمة بسبب تغييرات المَعلمات في الإصدارات المختلفة.
استخدِم أحد الخيارات التالية لتحديث الإضافة، وذلك حسب مكان تثبيتها:
- من وحدة تحكّم Firebase
- من واجهة سطر الأوامر (CLI) في Firebase باستخدام:
firebase ext:update <extension-instance-id> --project <project-id> firebase deploy --only extensions --project <project-id>
في حال تخطّي هذه الخطوة، ستطلب منك واجهة سطر الأوامر الترقية عند تصدير الإعدادات إذا لم يكن إصدار الإضافة هو الأحدث.
2. مراجعة وتثبيت مثيل حزمة الوظائف البديلة
يمكنك تثبيت حزمة الدوال باستخدام أمر واجهة سطر الأوامر التالي:
firebase functions:kits:install --template migration --no-configure --package <npm-package-name> --project <project-id>
عند اختيار معرّف مثيل لحزمة تطوير البرامج أثناء التثبيت، احرص على تدوينه لاستخدامه لاحقًا في تعليمات نقل البيانات.
بعد تثبيت الحزمة، يتم إنشاء دليل جديد داخل مشروعك Firebase بموقع مثل function-kits/<kit-name>/source يحتوي على حزمة npm مع الحزمة التي تحل محل الإضافة وملف index.ts أساسي يصدّر هذه الدوال ليتمكن Firebase من نشرها وضبط الإعدادات المخصّصة.
راجِع ملف README الخاص بالحزمة واتّبِع أي تعليمات إضافية واردة فيه.
إذا كان لديك عدة مثيلات للحزمة في المشروع نفسه، يمكنك تكرار هذا الأمر لإنشاء مثيلات جديدة من الحزمة نفسها. يمكنك أيضًا نشر نسخة واحدة من الحزمة في مشروعَين مختلفَين على Firebase بإعدادات مختلفة (على سبيل المثال، مشروع تجريبي ومشروع إنتاج). لمزيد من المعلومات حول عمليات الإعداد المتقدّمة هذه، يُرجى الاطّلاع على عمليات النقل المتقدّمة.
مثال محلول:
firebase functions:kits:install --template migration --no-configure --package @firebase-function-kits/firestore-bigquery-export --project my-project
3- ضبط مثيل حزمة الدوال بشكل مطابق للإضافة
عليك تخصيص نسخة حزمة تطوير البرامج هذه باستخدام إعدادات مطابقة للإضافة التي يتم استبدالها. يمكنك تصدير إعدادات مثيل الإضافة إلى ملف .env، الذي يخزّن بيانات إعدادات المَعلمات ومتغيّرات البيئة ومراجع الأسرار لجميع Cloud Functions، بما في ذلك الحِزم. لتصديرها مباشرةً إلى ملف الإعداد الخاص بحزمة تطوير البرامج، نفِّذ ما يلي:
firebase ext:export --mode functions --instance <extension-instance-id> --kit-instance <kit-instance-id> --project <project-id>
في نهاية هذه الخطوة، يتم تخزين معلومات الإعداد لهذا الجهاز الظاهري في ملف .env خاص بالمشروع في دليل إعدادات الجهاز الظاهري، مثل:
function-kits/<kit-name>/config-<instance-id>/.env.<project-id>
4. نشر عملية استبدال مجموعة أدوات الاستشعار والتحقّق منها
بعد تثبيت الحزمة وتوفّرها كمجموعة من الدوال، يمكنك نشر بديل الحزمة. تعمل حِزم الدوال مثل الدوال العادية، حيث يعمل كل مثيل من الحزمة كقاعدة رموز برمجية منفصلة لتنظيم الدوال. يمكنك اختيار نشر جميع الدوال أو مثيل حزمة معيّن فقط. أثناء نقل مثيل إضافة واحد، لا تنشر سوى مثيل الحزمة هذا.
إذا كانت حزمة الأدوات تستخدم أي مَعلمات جديدة لم تكن متوفّرة في مثيل الإضافة الذي نقلت منه، سيطلب منك واجهة سطر الأوامر Firebase إدخالها في بداية عملية النشر. لا يُتوقّع حدوث ذلك في هذا المثال العملي من إضافة firestore-bigquery-export حديثة، ولكن العديد من الحِزم تطلب مَعلمة جديدة لأي مصدر لتفعيل الأحداث تستخدمه الحزمة. وكجزء من عملية النقل هذه، تستخدم الحِزم المعدَّلة دوال الجيل الثاني، بينما كانت الإضافات تستخدم دوال الجيل الأول. في الجيل الثاني، تقع الدوال بالقرب من مصادر الأحداث الخاصة بها، ويتم إضافتها كمَعلمة إضافية. في التحديثات المستقبلية، إذا تمت إضافة مَعلمات جديدة، سيطلب منك واجهة سطر الأوامر إدخالها عند النشر التالي.
مثال محلول:
firebase deploy --only functions:firestore-bigquery-export --project my-project
الناتج:
=== Deploying to 'my-project'...
i deploying functions
i functions: Loaded environment variables from function-kits/firestore-bigquery-export/config-firestore-bigquery-export/.env.my-project
i functions: ensuring required API bigquery.googleapis.com is enabled...
i functions: ensuring required API cloudtasks.googleapis.com is enabled...
✔ functions: required APIs are enabled
i functions: granting declarative IAM roles to managed service account:
- BigQuery Data Editor
- BigQuery User
- Cloud Datastore User
- Eventarc Event Receiver
- roles/run.invoker
✔ functions: successfully granted IAM roles
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-fsexportbigquery(us-central1)...
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-initBigQuerySync(us-central1)...
i functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-setupBigQuerySync(us-central1)...
✔ functions[kit-firestore-bigquery-export-fsexportbigquery(us-central1)] Successful create operation.
✔ functions[kit-firestore-bigquery-export-initBigQuerySync(us-central1)] Successful create operation.
✔ functions[kit-firestore-bigquery-export-setupBigQuerySync(us-central1)] Successful create operation.
i functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔ functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/us-central1/queues/kit-firestore-bigquery-export-initBigQuerySync.
✔ Deploy complete!
للتحقّق من أنّ firebase deploy لم يتضمّن أي أخطاء، راجِع سجلّات النشر لمعرفة ما إذا تم تشغيل أي خطافات لدورة الحياة. تستخدم الإضافات الشائعة، مثل Stream Cloud Firestore إلى BigQuery، خطافات مراحل النشاط. في ما يلي مثال على شكل خطاف دورة الحياة عند تشغيله:
i functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔ functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project
تؤكّد رسائل السجلّ هذه ما يلي:
- تم العثور على خطاف دورة حياة وتنفيذه.
- تمت إضافة مهمة إلى قائمة انتظار المهام المرتبطة بخطاف دورة الحياة.
- تم توفير رابط إلى Cloud Logging حتى تتمكّن من التأكّد من أنّ المهمة اكتملت بدون أخطاء.
اتبع رابط السجلّات إلى وحدة تحكّم Google Cloud للتحقّق من عدم وجود أي أخطاء في السجلّات ومن أنّه تمت معالجة حدث قائمة انتظار المهام بنجاح. إذا لم يتم تنفيذ حدث يتم في مراحل النشاط بنجاح، يمكنك إعادة تشغيله من خلال تنفيذ ما يلي:
firebase functions:lifecycle:run <hook-name> <codebase>
إذا كنت بصدد نشر مثيل لحزمة دوال للمرة الأولى، نفِّذ ما يلي:
firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>
إذا أردت في أي وقت أثناء عملية التحقّق إيقاف عملية النقل هذه أو التراجع عنها، يمكنك إلغاء تثبيت الحزمة باتّباع التعليمات الواردة في مقالة إلغاء تثبيت الإضافة.
5- إلغاء تثبيت الإضافة
بعد إثبات ملكية مجموعة الدوال التي تم نشرها، يمكنك إلغاء تثبيت الإضافة حتى لا يتكرّر سلوكها مرة للمجموعة ومرة للإضافة. يمكنك إلغاء تثبيت جميع الإضافات من واجهة سطر الأوامر Firebase
بغض النظر عن طريقة تثبيتها، وذلك إذا أضفت العلامة --immediate:
firebase ext:uninstall <extension-instance-id> --project <project-id> --immediate
مثال محلول:
firebase ext:uninstall firestore-bigquery-export --project my-project --immediate
الناتج:
i extensions: uninstalling firestore-bigquery-export...
i extensions: deleting extension instance resources in project my-project...
✔ extensions: successfully uninstalled firestore-bigquery-export
عمليات نقل البيانات المتقدّمة
يمكنك استخدام الإضافات في عدة مشاريع Firebase تريد إدارتها باستخدام قاعدة رموز برمجية واحدة. على سبيل المثال، إذا نشرت البنية الأساسية نفسها في بيئة testing وبيئة production، وكان لكل منهما مثيل documents Cloud Firestore تصدّره إلى BigQuery، قد يكون لديك مثيلان من إضافة firestore-bigquery-export مثبّتَين:
export-documents-testingexport-documents-production
إذا نقلت مثيلَي الإضافة هذين إلى مثيلَي حزمة وظائف في قاعدة رموز برمجية واحدة عند استخدام واجهة سطر الأوامر Firebase ونشرت باستخدام firebase deploy --project testing وfirebase deploy --project production، سيؤدي كل نشر إلى إنشاء مثيلَين في كل من بيئتَي testing وproduction.
بدلاً من ذلك، استبدِل مثيلَي الإضافة بمثيل واحد من حزمة الدوال firestore-bigquery-export تم نشره في مشاريع متعددة، حيث يتضمّن كل مشروع إعداداته الخاصة. يجب أن يبدو دليل الإعدادات الخاص بالمثيل على النحو التالي:
config-export-documents/.env.testing.env.production
يؤدي كل نشر في testing وproduction إلى إنشاء مثيل واحد من حزمة تطوير البرامج مع الإعدادات المقابلة. تنشئ أوامر واجهة سطر الأوامر الحالية عملية الإعداد هذه طالما أنّك تمرّر العلامة --project في كل استدعاء للأمر ext:migrate أو functions:kits:install.
مثال محلول:
firebase functions:kits:install --package @firebase-function-kits/firestore-bigquery-export --project testing --no-configure --template migration
✔ What would you like to name this kit? firestore-bigquery-export
✔ What would you like to name this instance? export-documents
✔ Wrote function-kits/firestore-bigquery-export/source/package.json
✔ Wrote function-kits/firestore-bigquery-export/source/tsconfig.json
✔ Wrote function-kits/firestore-bigquery-export/source/.gitignore
✔ Wrote function-kits/firestore-bigquery-export/source/src/index.ts
i functions: Running npm install
✔ Wrote configuration info to firebase.json
✔ functions: Function kit firestore-bigquery-export successfully installed.
# This creates the export-documents instance with an empty .env.testing file
# for the testing project. Now populate it via export:
firebase ext:export --mode functions --instance export-documents-testing \
--kit-instance export-documents --project testing
# Repeat the export for production into the same kit instance to create
# .env.production from the export-documents-prod instance:
firebase ext:export --mode functions --instance export-documents-prod \
--kit-instance export-documents --project production
يتوفّر لديك الآن مثيل واحد من الحزمة تم إعداده ليتم نشره في مشروعَي testing وproduction مع الإعدادات الخاصة بكل منهما. إذا أنشأت مثيلاً في المشروع testing ونفّذت الأمر functions:kits:install للحزمة نفسها في المشروع production، سيُطلب منك اختيار إعادة استخدام المثيل الذي تم إعداده للمشروع testing أو تثبيت مثيل ثانٍ.