تكرار السؤال: …
الإجابة المختصرة
يحدد ملف requirements ما يجب تثبيته، بينما يقيّد ملف constraints الإصدارات المسموح بها لحزم قد تُثبت دون أن يضيف أي حزمة بنفسه.
الشرح
تفيد constraints في توحيد إصدارات الاعتماديات غير المباشرة (transitive) عبر عدة خدمات أو بيئات: pip install -r requirements.txt -c constraints.txt. وفي التطبيقات يُفضل ملف قفل كامل مولّد آليًا (pip-tools أو uv.lock أو poetry.lock) يثبت كل الإصدارات مع hashes لضمان تكرار البناء بدقة. افهم الفرق بين الاعتماديات المباشرة وغير المباشرة، وحدّث القفل دوريًا مع مراجعة التغييرات.
مثال بالكود
# requirements.in (المباشرة فقط)
fastapi
sqlalchemy>=2
# توليد قفل كامل مع hashes
# uv pip compile requirements.in -o requirements.txt --generate-hashes
# constraints.txt يقيد دون أن يضيف
urllib3<3
# pip install -r requirements.txt -c constraints.txtأخطاء شائعة
- عدم تثبيت الاعتماديات غير المباشرة فيتغير البناء بين يوم وآخر.
- تحرير ملف القفل يدويًا بدل إعادة توليده.