มันแย่ที่จะมีไดเรกทอรี virtualenv ของฉันภายในที่เก็บ git ของฉัน?


285

ฉันกำลังคิดที่จะวาง virtualenv สำหรับเว็บแอป Django ที่ฉันกำลังทำอยู่ภายในที่เก็บคอมไพล์ของฉันสำหรับแอพ ดูเหมือนจะเป็นวิธีที่ง่ายในการทำให้การปรับใช้ง่ายและสะดวก มีเหตุผลใดที่ฉันไม่ควรทำเช่นนี้?

คำตอบ:


302

ฉันใช้pip freezeเพื่อรับแพ็คเกจที่ฉันต้องการลงในrequirements.txtไฟล์และเพิ่มลงในที่เก็บของฉัน ฉันพยายามคิดว่าทำไมคุณถึงต้องการจัดเก็บ virtualenv ทั้งหมด แต่ฉันทำไม่ได้


81
คุณสามารถประหยัดพื้นที่ที่ไม่จำเป็นใน repo ของคุณและยังคงปรับใช้กับเซิร์ฟเวอร์ใหม่ในคำสั่งเดียว: virtualenv - no-site-packages --distribute .env && source .env / bin / เปิดใช้งาน && pip pip -r requirements.txt
RyanBrady

2
ฉันจะให้คำตอบกับคำถามนี้เพราะอาจเป็น "แนวปฏิบัติที่ดีที่สุด" และคุณเสนอให้ก่อน ฉันได้พบปัญหาบางอย่างที่ทุกคนกล่าวถึงอย่างแน่นอน ฉันประเมินว่าฉันให้เวลากับตัวเองในอีกหนึ่งวันก่อนที่ฉันจะทำในสิ่งที่พวกคุณแนะนำมาตลอดและใช้ pip และไฟล์ข้อกำหนด ขอบคุณสำหรับความช่วยเหลือของคุณ!
Lyle Pratt

11
หากคุณพูดpip install mysql-pythonบนเครื่อง 64 บิตและจากนั้นบางคนที่มีเครื่อง 32 บิตพยายามใช้มันจะไม่ทำงาน มันใช้โมดูล C เช่นเดียวกับโมดูล Python จำนวนมากเพื่อเพิ่มประสิทธิภาพ ฉันคิดว่า Windows-> Linux จะไม่ทำงานเช่นกัน
Matt Williamson

7
เพียงข้อสังเกต: เราได้รับบิตในอดีตเพราะอย่างใดห้องสมุดจะไม่สามารถใช้ได้จาก pip (รุ่นเก่าเกินไป) บังคับให้อัปเกรดในขณะที่เว็บไซต์ถูกลง ดังนั้น ... ตอนนี้ฉันจะไม่พึ่งพาpip freezeอีกต่อไปที่จะทำเช่นนี้ ปัญหาคือว่าระหว่างที่คุณบังคับให้ใช้การอัพเกรดซ้ำจะไม่มีใครจ่ายค่านั้นและสำหรับการอัพเกรดระดับกลาง (การบำรุงรักษา "แนวปฏิบัติที่ดีที่สุด") ไม่มีใครทำเช่นกัน
สัญญาบอกว่าฉันถูก

5
หมายเหตุเกี่ยวกับความคิดเห็น @RayanBrady: ตัวเลือก--distributeและ--setuptoolsตอนนี้ไม่ได้เปิดใช้งาน (แจกจ่ายนั่นคือส้อมของ setuptools ถูกรวมกลับไปนานแล้ว) --no-site-packages
เลิกใช้

49

การจัดเก็บไดเรกทอรี virtualenv ภายใน git จะช่วยให้คุณสามารถปรับใช้แอพทั้งหมดโดยเพียงแค่ทำการ git clone (รวมถึงการติดตั้งและกำหนดค่า Apache / mod_wsgi) ปัญหาที่สำคัญอย่างหนึ่งที่อาจเกิดขึ้นกับวิธีนี้คือบน Linux เส้นทางแบบเต็มจะได้รับการเข้ารหัสแบบยากลำบากในการเปิดใช้งานของ venv django-admin.py, easy_install และสคริปต์ pip ซึ่งหมายความว่า virtualenv ของคุณจะไม่ทำงานอย่างสมบูรณ์หากคุณต้องการใช้เส้นทางที่แตกต่างกันบางทีอาจเรียกใช้โฮสต์เสมือนหลายรายการบนเซิร์ฟเวอร์เดียวกัน ฉันคิดว่าเว็บไซต์อาจใช้งานได้กับเส้นทางที่ผิดในไฟล์เหล่านั้น แต่คุณจะมีปัญหาในครั้งต่อไปที่คุณพยายามเรียกใช้ pip

วิธีแก้ปัญหาที่ให้ไว้แล้วคือการเก็บข้อมูลเพียงพอใน git เพื่อให้ในระหว่างการปรับใช้คุณสามารถสร้าง virtualenv และทำการติดตั้ง pip ที่จำเป็น โดยทั่วไปแล้วคนpip freezeจะเรียกใช้เพื่อรับรายการจากนั้นเก็บไว้ในไฟล์ที่ชื่อว่า requirements.txt มันสามารถโหลดpip install -r requirements.txtได้ RyanBrady แสดงให้เห็นแล้วว่าคุณจะใช้คำสั่งการปรับใช้ในบรรทัดเดียวได้อย่างไร:

# before 15.1.0
virtualenv --no-site-packages --distribute .env &&\
    source .env/bin/activate &&\
    pip install -r requirements.txt

# after deprecation of some arguments in 15.1.0
virtualenv .env && source .env/bin/activate && pip install -r requirements.txt

โดยส่วนตัวฉันเพิ่งใส่สิ่งเหล่านี้ลงในเชลล์สคริปต์ที่ฉันรันหลังจากทำการโคลน git หรือ git pull

การจัดเก็บไดเรกทอรี virtualenv ทำให้การจัดการ pip ทำได้ยากขึ้นเนื่องจากคุณจะต้องเพิ่ม / ลบและส่งไฟล์ที่เกิดจากการอัพเกรดด้วยตนเอง กับแฟ้ม requirements.txt คุณเพียงแค่เปลี่ยนสายที่เหมาะสมใน requirements.txt pip install -r requirements.txtและอีกระยะ ตามที่ระบุไว้แล้วสิ่งนี้จะลด "ส่งสแปม"


4
โปรดทราบว่า - การแจกจ่ายถูกเลิกใช้แล้ว (อย่างน้อยใน 15.1.0): --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
AnthonyC

1
--no-site-packagesจะเลิกใน 15.1.0 เช่นกันซึ่งตอนนี้เป็นค่าเริ่มต้น
cjs

35

ฉันเคยทำเช่นเดียวกันจนกระทั่งฉันเริ่มใช้ห้องสมุดที่รวบรวมแตกต่างกันไปขึ้นอยู่กับสภาพแวดล้อมเช่น PyCrypto My PyCrypto mac จะไม่ทำงานบน Cygwin จะไม่ทำงานบน Ubuntu

มันจะกลายเป็นฝันร้ายที่สุดในการจัดการพื้นที่เก็บข้อมูล

ฉันพบว่าการจัดการ pip freeze & a requirements นั้นง่ายกว่าการใช้ git ทั้งหมด มันก็ทำความสะอาดเช่นกันเนื่องจากคุณหลีกเลี่ยงการส่งสแปมเป็นพันไฟล์เนื่องจากห้องสมุดเหล่านั้นได้รับการอัปเดต ...


อืมมม ฉันไม่มีปัญหากับการรวบรวมสิ่งต่าง ๆ ในสภาพแวดล้อมที่แตกต่างกันอย่างแน่นอน ฉันเดาว่ามันน่าจะคุ้มค่าที่จะไม่ทำแค่เพื่อหลีกเลี่ยงการส่งสแปม
Lyle Pratt

@ LylePratt: ฉันคิดว่าตรงกันข้าม: ดีกว่าไม่รวม virtualenv ทั้งหมดในพื้นที่เก็บข้อมูลเพียงเพื่อหลีกเลี่ยงปัญหาการมีเครื่องมือที่ยอดเยี่ยมเช่น PyCrypto หรือ PIL
Tadeck

17

ฉันคิดว่าหนึ่งในปัญหาหลักที่เกิดขึ้นคือ virtualenv อาจไม่สามารถใช้งานได้โดยคนอื่น เหตุผลก็คือมันมักจะใช้เส้นทางที่แน่นอน ดังนั้นหากคุณ virtualenv เป็นตัวอย่าง/home/lyle/myenv/มันจะถือว่าเหมือนกันสำหรับคนอื่น ๆ ทั้งหมดที่ใช้พื้นที่เก็บข้อมูลนี้ (มันจะต้องเป็นเส้นทางที่แน่นอนแน่นอนเดียวกัน) คุณไม่สามารถทึกทักเอาคนอื่นโดยใช้โครงสร้างไดเรกทอรีเดียวกับคุณ

แนวทางปฏิบัติที่ดีกว่าคือทุกคนกำลังตั้งค่าสภาพแวดล้อมของตัวเอง (ไม่ว่าจะมีหรือไม่มี virtualenv) และติดตั้งไลบรารีที่นั่น สิ่งนี้ยังทำให้คุณสามารถใช้งานรหัสได้มากกว่าแพลตฟอร์มที่แตกต่างกัน (Linux / Windows / Mac) และเนื่องจาก virtualenv นั้นถูกติดตั้งแตกต่างกันในแต่ละแพลตฟอร์ม


นี่เป็นเหตุผลว่าทำไมจึงเป็นความคิดที่ดีที่จะเก็บ virtualenv ไว้ใน SCM แต่มันก็คุ้มค่าที่จะพิจารณาบางอย่างเช่นคำแนะนำหรือเหตุการณ์ของ @ RJBrady สคริปต์ bootstrap.pyเนื่องจากมีวิธีการสร้างสภาพแวดล้อมเดียวกันบนเครื่อง ความต้องการอย่างจริงจังเมื่อทำงานกับคนอื่น
ig0774

ฉันไม่แน่ใจจริงๆว่าปัญหาที่คุณพูดถึงจะเป็นปัญหาในสถานการณ์ของฉันอย่างแน่นอน แอป Django ของฉันมีไฟล์. wsgi ที่กำหนดว่า virtualenv สัมพันธ์กับตำแหน่งของมันอย่างไร (2 ไดเรกทอรีขึ้นไป '../../env') ดังนั้นในสถานการณ์ของฉันปัญหาของเส้นทางที่แน่นอนไม่ควรส่งผลเสียต่อฉัน ... ใช่มั้ย
Lyle Pratt

หากคุณใช้งานแอพของคุณด้วย WSGI คุณก็อาจหนีไปได้ หากคุณใช้เซิร์ฟเวอร์การพัฒนา (ผ่านmanage.py) คุณจะพบปัญหาแน่นอน
Torsten Engelbrecht

3

ฉันใช้คำตอบของ David Sickmillerโดยอัตโนมัติ ฉันสร้างไฟล์ (ไม่สามารถดำเนินการได้) ที่ระดับบนสุดของโปรเจ็กต์ชื่อactivateด้วยเนื้อหาต่อไปนี้:

[ -n "$BASH_SOURCE" ] \
    || { echo 1>&2 "source (.) this with Bash."; exit 2; }
(
    cd "$(dirname "$BASH_SOURCE")"
    [ -d .build/virtualenv ] || {
        virtualenv .build/virtualenv
        . .build/virtualenv/bin/activate
        pip install -r requirements.txt
    }
)
. "$(dirname "$BASH_SOURCE")/.build/virtualenv/bin/activate"

(ตามคำตอบของเดวิดสิ่งนี้ถือว่าคุณทำpip freeze > requirements.txtเพื่อรักษารายการข้อกำหนดให้ทันสมัยอยู่เสมอ)

ข้างต้นให้ความคิดทั่วไป สคริปต์การเปิดใช้งานจริง( เอกสาร ) ที่ฉันใช้ตามปกติมีความซับซ้อนมากขึ้นเล็กน้อยให้-qตัวเลือก (เงียบ) ใช้pythonเมื่อpython3ไม่พร้อมใช้งาน ฯลฯ

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

cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate

การจัดหา./activateไม่ใช่activateสิ่งสำคัญที่นี่เพราะหลังจะค้นหาสิ่งอื่น ๆactivateในเส้นทางของคุณก่อนที่จะหาหนึ่งในไดเรกทอรีปัจจุบัน


รักวิธีการนี้! ฟังดูสมเหตุสมผลมากขอบคุณสำหรับการแบ่งปัน
Esolitos

ฉันต้องเปลี่ยนบรรทัดแรก[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }เพื่อตรวจสอบว่าสคริปต์ถูกดำเนินการตรงข้ามกับที่มา
Chris Snow

3

ไม่ใช่ความคิดที่ดีที่จะรวมองค์ประกอบที่ขึ้นอยู่กับสภาพแวดล้อมหรือการตั้งค่าใน repos ของคุณเป็นหนึ่งในประเด็นสำคัญของการใช้ repo อาจเป็นการแบ่งปันกับนักพัฒนาคนอื่น ๆ นี่คือวิธีที่ฉันจะตั้งค่าสภาพแวดล้อมการพัฒนาของฉันบนพีซี Windows (เช่น Win10)

  1. เปิด Pycharm และในหน้าแรกเลือกที่จะตรวจสอบโครงการจากระบบควบคุมแหล่งที่มาของคุณ (ในกรณีของฉันฉันใช้ github)

  2. ใน Pycharm ไปที่การตั้งค่าและเลือก "Project Interpreter" และเลือกตัวเลือกเพื่อเพิ่มสภาพแวดล้อมเสมือนใหม่คุณสามารถเรียกมันว่า "venv"

  3. เลือกตัวแปลภาษาไพ ธ อนพื้นฐานซึ่งอยู่ที่ C: \ Users {user} \ AppData \ Local \ Programs \ Python \ Python36 (ตรวจสอบให้แน่ใจว่าคุณได้เลือกเวอร์ชันที่เหมาะสมของ Python ตามสิ่งที่คุณติดตั้งไว้)

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

  5. ให้ Pycharm ทำการสแกนตามที่จำเป็นในการสร้าง / รีเฟรชโครงกระดูกโครงการของคุณ

  6. ยกเว้นโฟลเดอร์ venv จากปฏิสัมพันธ์คอมไพล์ของคุณ (เพิ่ม venv \ to .gitignoreไฟล์ในโฟลเดอร์โครงการของคุณ)

โบนัส: หากคุณต้องการให้ผู้คนติดตั้งไลบรารีทั้งหมดที่ซอฟต์แวร์ของคุณต้องการได้อย่างง่ายดาย

pip freeze > requirements.txt

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

pip install -r requirements.txt 

2

หากคุณรู้ว่าระบบปฏิบัติการใดที่แอปพลิเคชันของคุณจะใช้งานฉันจะสร้าง virtualenv หนึ่งระบบสำหรับแต่ละระบบและรวมไว้ในที่เก็บของฉัน จากนั้นฉันจะทำให้แอปพลิเคชันของฉันตรวจพบว่าระบบกำลังทำงานอยู่และใช้ virtualenv ที่สอดคล้องกัน

ระบบสามารถระบุได้เช่นโดยใช้โมดูลแพลตฟอร์ม

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

หากคุณไม่ทราบว่าระบบปฏิบัติการของคุณอาจใช้งานแอปพลิเคชั่นใดคุณอาจใช้pip freezeคำแนะนำในคำตอบอื่น ๆ ได้ดีกว่า


0

ฉันคิดว่าดีที่สุดคือการติดตั้งสภาพแวดล้อมเสมือนในเส้นทางภายในโฟลเดอร์ที่เก็บอาจจะรวมดีกว่าที่จะใช้ไดเรกทอรีย่อยที่ทุ่มเทให้กับสภาพแวดล้อม (ฉันได้ลบโครงการทั้งหมดของฉันโดยไม่ตั้งใจเมื่อบังคับติดตั้งสภาพแวดล้อมเสมือนในรากที่เก็บข้อมูล โฟลเดอร์ที่ดีที่ฉันมีโครงการบันทึกไว้ในรุ่นล่าสุดใน Github)

ไม่ว่าจะเป็นโปรแกรมติดตั้งอัตโนมัติหรือเอกสารควรระบุเส้นทาง virtualenv เป็นเส้นทางสัมพัทธ์วิธีนี้คุณจะไม่ประสบปัญหาเมื่อแบ่งปันโครงการกับผู้อื่น เกี่ยวกับแพคเกจ, pip freeze -r requirements.txtแพคเกจที่ใช้จะถูกบันทึกไว้โดย


-1

หากคุณเพียงแค่ตั้งค่า env การพัฒนาให้ใช้ไฟล์ pip freeze caz ที่ทำให้ git repo ใหม่หมด

จากนั้นถ้าทำการปรับใช้การผลิตแล้วให้ตรวจสอบโฟลเดอร์ venv ทั้งหมด ซึ่งจะทำให้การปรับใช้ของคุณสามารถทำซ้ำได้มากขึ้นไม่จำเป็นต้องมีแพ็คเกจ libxxx-dev เหล่านั้นและหลีกเลี่ยงปัญหาอินเทอร์เน็ต

ดังนั้นมีสอง repos หนึ่งรายการสำหรับซอร์สโค้ดหลักของคุณซึ่งรวมถึง requirements.txt และ env repo ซึ่งมีทั้งโฟลเดอร์ venv

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