จะปรับแต่ง requirements.txt สำหรับหลายสภาพแวดล้อมได้อย่างไร?


113

ฉันมีสองสาขาการพัฒนาและการผลิต แต่ละคนมีการพึ่งพาซึ่งบางส่วนก็แตกต่างกัน การพัฒนาชี้ไปที่การพึ่งพาที่ตัวเองอยู่ในการพัฒนา เช่นเดียวกันสำหรับการผลิต ฉันต้องการปรับใช้กับ Heroku ซึ่งคาดว่าการอ้างอิงของแต่ละสาขาในไฟล์เดียวที่เรียกว่า 'requirements.txt'

วิธีที่ดีที่สุดในการจัดระเบียบคืออะไร?

สิ่งที่ฉันคิด:

  • รักษาไฟล์ข้อกำหนดแยกต่างหากหนึ่งไฟล์ในแต่ละสาขา (ต้องมีการผสานบ่อยๆ!)
  • บอก Heroku ว่าต้องการใช้ไฟล์ข้อกำหนดใด (ตัวแปรสภาพแวดล้อม?)
  • เขียนสคริปต์การปรับใช้ (สร้างสาขาชั่วคราวแก้ไขไฟล์ข้อกำหนดคอมมิตปรับใช้ลบสาขาชั่วคราว)

1
ปรับใช้สคริปต์ได้ง่ายขึ้น: รักษา 2 ไฟล์ ใช้ symlink ระหว่างกัน
Udy

คำตอบ:


209

คุณสามารถเรียงไฟล์ข้อกำหนดของคุณและใช้แฟล็ก "-r" เพื่อบอกให้ pip รวมเนื้อหาของไฟล์หนึ่งไว้ในอีกไฟล์หนึ่ง คุณสามารถแบ่งความต้องการของคุณออกเป็นลำดับชั้นของโฟลเดอร์แบบแยกส่วนได้ดังนี้:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

เนื้อหาของไฟล์จะมีลักษณะดังนี้:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

นอก Heroku ตอนนี้คุณสามารถตั้งค่าสภาพแวดล้อมเช่นนี้:

pip install -r requirements/dev.txt

หรือ

pip install -r requirements/prod.txt

เนื่องจาก Heroku มองหา "requirements.txt" ที่รูทโปรเจ็กต์โดยเฉพาะจึงควรทำมิเรอร์ prod ดังนี้:

Requirement.txt:

# Mirrors prod
-r requirements/prod.txt

2
คุณเพิกเฉยต่อปัญหาในการใช้ไฟล์ข้อกำหนดแยกต่างหากสำหรับสภาพแวดล้อมต่างๆบน heroku
Ed J

30
ฉันเชื่อว่าคำตอบของฉันพูดถึงเรื่องนั้น
Christian Abbott

1
ฉันกำลังมองหาวิธีที่จะมีข้อกำหนดที่แตกต่างกันใน Heroku สำหรับการจัดเตรียม (ซึ่งฉันต้องการแพ็คเกจดีบักเพิ่มเติม) และสภาพแวดล้อมการผลิต (ซึ่งฉันไม่ต้องการแพ็คเกจดีบักเหล่านี้) น่าเสียดายที่ @EdJ กล่าวคำตอบนี้ไม่ได้กล่าวถึงเรื่องนี้
Antoine Pinsard

1
ฉันอาจเข้าใจผิดคำถามของคุณหรือบางทีคำถามของคุณอาจแตกต่างจากผู้โพสต์ต้นฉบับ แต่เพื่อความชัดเจนข้อกำหนดของสาขาการจัดเตรียมสามารถมี "-r requirements / staging.txt" (หรือคล้ายกัน) ในขณะที่สาขา prod สามารถมี "-r requirements / prod.txt" (ดูคำตอบของฉันตอนท้าย) ซิงค์สาขาที่เหมาะสมกับอินสแตนซ์ Heroku ที่เกี่ยวข้อง
Christian Abbott

2
@SohamNavadiya นั่นไม่ใช่สิ่งที่ฉันถาม สมมติว่าฉันมีbase.txt3 แพ็คเกจอยู่ในนั้นและdev.txtมี 1 แพ็คเกจอยู่ในนั้น (และ-r base.txt) แพคเกจทั้ง 4 ถูกติดตั้งในสภาพแวดล้อมเสมือนของฉัน ตอนนี้ฉันต้องการติดตั้งแพ็คเกจที่ 5 และแสดงรายการในฐานไม่ใช่ใน dev ฉันจะทำอย่างไร แน่นอนว่าฉันสามารถติดตั้งได้pip freeze > base.txtแต่ก็ไม่สามารถแก้ปัญหาได้ จากนั้นทำให้การพึ่งพา dev ที่ 4 อยู่ในฐานที่ฉันไม่ต้องการ
Manan Mehta

11

ตัวเลือกที่ทำงานได้ในวันนี้ซึ่งไม่มีอยู่เมื่อมีการโพสต์คำถามและคำตอบเดิมคือการใช้pipenvแทน pip เพื่อจัดการการอ้างอิง

ด้วย pipenv การจัดการไฟล์ข้อกำหนดสองไฟล์ที่แยกกันด้วยตนเองเช่นกับ pip ไม่จำเป็นอีกต่อไปและ pipenv จะจัดการแพ็กเกจการพัฒนาและการผลิตด้วยตัวเองผ่านการโต้ตอบบนบรรทัดคำสั่งแทน

ในการติดตั้งแพ็คเกจสำหรับใช้ทั้งในการผลิตและการพัฒนา:

pipenv install <package>

ในการติดตั้งแพ็คเกจสำหรับสภาพแวดล้อมการพัฒนาเท่านั้น:

pipenv install <package> --dev

ผ่านคำสั่งเหล่านั้น pipenv จะจัดเก็บและจัดการการกำหนดค่าสภาพแวดล้อมในสองไฟล์ (Pipfile และ Pipfile.lock) Python buildpack ปัจจุบันของ Heroku รองรับ pipenv โดยกำเนิดและจะกำหนดค่าเองจาก Pipfile.lock หากมีอยู่แทนที่จะเป็น requirements.txt

ดูลิงค์ pipenv สำหรับเอกสารประกอบเครื่องมือฉบับเต็ม


5
pipenv เสียเวลา การล็อกใช้เวลานานเกินไป
nurettin

10
pipenv เสียเกือบทุกด้าน สัญญามาก แต่มีเรือน้อยมาก
ospider

5
@ospider ใช้ pipenv เป็นประจำทุกวันและฉันไม่พบปัญหาเชิงลบดังที่คุณและ nurettin กำลังรายงาน การทำงานกับ pipenv เวอร์ชัน 2018.10.13 การแตกหักในทุกด้านจึงเป็นคำสั่งที่ว่างเปล่า
Kwuite

1
@ Kwuite ฉันแบ่งปันความรู้สึกของประโยคสุดท้ายของคุณ มีบทสนทนาเล็ก ๆ น้อย ๆ ที่ต้องมีส่วนร่วมเมื่อความคิดเห็นมีความสำคัญ แต่ไม่ว่างเปล่า
Christian Abbott

3
เห็นด้วยกับ nurettin และ ospider pipenv แย่มาก
Andrew Palmer

3

หากความต้องการของคุณคือสามารถสลับไปมาระหว่างสภาพแวดล้อมในเครื่องเดียวกันได้อาจจำเป็นต้องสร้างโฟลเดอร์ Virtualenv ที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อมที่คุณต้องการเปลี่ยนไปใช้

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.