แยกแต่ละโปรเจกต์ไว้ใน venv ของตัวเอง ตรึงเวอร์ชันของดีเพนเดนซี และใช้โครงสร้างโปรเจกต์ที่สร้างซ้ำได้
เปิดบทเรียนนี้ใน Kodokonการติดตั้งดีเพนเดนซีของทุกโปรเจกต์ไว้ในอินเทอร์พรีเตอร์ตัวเดียวกันนำไปสู่ความขัดแย้งของเวอร์ชันโดยตรง: โปรเจกต์ A ต้องการ requests 2.31 ส่วนโปรเจกต์ B ต้องการเวอร์ชันที่เข้ากันไม่ได้ สภาพแวดล้อมเสมือน (venv) แยกแต่ละโปรเจกต์ออกจากกัน: อินเทอร์พรีเตอร์ของมันเอง pip ของมันเอง แพ็กเกจของมันเอง นี่คือแนวปฏิบัติแบบมืออาชีพที่ต่อรองไม่ได้ - หนึ่งโปรเจกต์ หนึ่งสภาพแวดล้อม ที่สร้างขึ้นใหม่ให้เหมือนเดิมได้บนเครื่องใด ๆ
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip listเพื่อให้การติดตั้งสร้างซ้ำได้ จงตรึงเวอร์ชันเอาไว้ pip freeze ส่งออกสภาพแวดล้อม ทั้งหมด รวมถึงดีเพนเดนซีทางอ้อม พร้อมเวอร์ชันที่แน่นอน: สร้างซ้ำได้สูงสุด แต่อัปเดตลำบาก แนวทางสมัยใหม่แยกสองความต้องการนี้ออกจากกัน: ดีเพนเดนซีโดยตรงประกาศไว้ใน pyproject.toml ด้วยข้อจำกัดที่หลวม ๆ และไฟล์ล็อกถูกสร้างขึ้นสำหรับการติดตั้งที่แน่นอน ในระดับของโปรเจกต์เล็ก ๆ requirements.txt ยังคงเป็นทางเลือกที่น่านับถืออย่างยิ่ง
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txtในด้านโครงสร้าง src layout คือมาตรฐานอ้างอิง: โค้ดอยู่ใน src/<package>/ เทสต์อยู่ใน tests/ และการตั้งค่าอยู่ใน pyproject.toml จุดประสงค์ของโฟลเดอร์ src ไม่ใช่เรื่องความสวยงาม: มันป้องกันการเผลออิมพอร์ตแพ็กเกจในเครื่องจากไดเรกทอรีปัจจุบัน ซึ่งจะไปบดบังข้อผิดพลาดของการทำแพ็กเกจ - เทสต์ของคุณจะรันกับแพ็กเกจที่ถูกติดตั้งจริง ระหว่างการพัฒนา pip install -e . จะติดตั้งโปรเจกต์ในโหมดแก้ไขได้ (editable)
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore