ฉันกำลังคิดที่จะวาง virtualenv สำหรับเว็บแอป Django ที่ฉันกำลังทำอยู่ภายในที่เก็บคอมไพล์ของฉันสำหรับแอพ ดูเหมือนจะเป็นวิธีที่ง่ายในการทำให้การปรับใช้ง่ายและสะดวก มีเหตุผลใดที่ฉันไม่ควรทำเช่นนี้?
ฉันกำลังคิดที่จะวาง virtualenv สำหรับเว็บแอป Django ที่ฉันกำลังทำอยู่ภายในที่เก็บคอมไพล์ของฉันสำหรับแอพ ดูเหมือนจะเป็นวิธีที่ง่ายในการทำให้การปรับใช้ง่ายและสะดวก มีเหตุผลใดที่ฉันไม่ควรทำเช่นนี้?
คำตอบ:
ฉันใช้pip freeze
เพื่อรับแพ็คเกจที่ฉันต้องการลงในrequirements.txt
ไฟล์และเพิ่มลงในที่เก็บของฉัน ฉันพยายามคิดว่าทำไมคุณถึงต้องการจัดเก็บ virtualenv ทั้งหมด แต่ฉันทำไม่ได้
pip install mysql-python
บนเครื่อง 64 บิตและจากนั้นบางคนที่มีเครื่อง 32 บิตพยายามใช้มันจะไม่ทำงาน มันใช้โมดูล C เช่นเดียวกับโมดูล Python จำนวนมากเพื่อเพิ่มประสิทธิภาพ ฉันคิดว่า Windows-> Linux จะไม่ทำงานเช่นกัน
pip freeze
อีกต่อไปที่จะทำเช่นนี้ ปัญหาคือว่าระหว่างที่คุณบังคับให้ใช้การอัพเกรดซ้ำจะไม่มีใครจ่ายค่านั้นและสำหรับการอัพเกรดระดับกลาง (การบำรุงรักษา "แนวปฏิบัติที่ดีที่สุด") ไม่มีใครทำเช่นกัน
--distribute
และ--setuptools
ตอนนี้ไม่ได้เปิดใช้งาน (แจกจ่ายนั่นคือส้อมของ setuptools ถูกรวมกลับไปนานแล้ว) --no-site-packages
การจัดเก็บไดเรกทอรี 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
และอีกระยะ ตามที่ระบุไว้แล้วสิ่งนี้จะลด "ส่งสแปม"
--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
--no-site-packages
จะเลิกใน 15.1.0 เช่นกันซึ่งตอนนี้เป็นค่าเริ่มต้น
ฉันเคยทำเช่นเดียวกันจนกระทั่งฉันเริ่มใช้ห้องสมุดที่รวบรวมแตกต่างกันไปขึ้นอยู่กับสภาพแวดล้อมเช่น PyCrypto My PyCrypto mac จะไม่ทำงานบน Cygwin จะไม่ทำงานบน Ubuntu
มันจะกลายเป็นฝันร้ายที่สุดในการจัดการพื้นที่เก็บข้อมูล
ฉันพบว่าการจัดการ pip freeze & a requirements นั้นง่ายกว่าการใช้ git ทั้งหมด มันก็ทำความสะอาดเช่นกันเนื่องจากคุณหลีกเลี่ยงการส่งสแปมเป็นพันไฟล์เนื่องจากห้องสมุดเหล่านั้นได้รับการอัปเดต ...
ฉันคิดว่าหนึ่งในปัญหาหลักที่เกิดขึ้นคือ virtualenv อาจไม่สามารถใช้งานได้โดยคนอื่น เหตุผลก็คือมันมักจะใช้เส้นทางที่แน่นอน ดังนั้นหากคุณ virtualenv เป็นตัวอย่าง/home/lyle/myenv/
มันจะถือว่าเหมือนกันสำหรับคนอื่น ๆ ทั้งหมดที่ใช้พื้นที่เก็บข้อมูลนี้ (มันจะต้องเป็นเส้นทางที่แน่นอนแน่นอนเดียวกัน) คุณไม่สามารถทึกทักเอาคนอื่นโดยใช้โครงสร้างไดเรกทอรีเดียวกับคุณ
แนวทางปฏิบัติที่ดีกว่าคือทุกคนกำลังตั้งค่าสภาพแวดล้อมของตัวเอง (ไม่ว่าจะมีหรือไม่มี virtualenv) และติดตั้งไลบรารีที่นั่น สิ่งนี้ยังทำให้คุณสามารถใช้งานรหัสได้มากกว่าแพลตฟอร์มที่แตกต่างกัน (Linux / Windows / Mac) และเนื่องจาก virtualenv นั้นถูกติดตั้งแตกต่างกันในแต่ละแพลตฟอร์ม
manage.py
) คุณจะพบปัญหาแน่นอน
ฉันใช้คำตอบของ 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
ในเส้นทางของคุณก่อนที่จะหาหนึ่งในไดเรกทอรีปัจจุบัน
[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }
เพื่อตรวจสอบว่าสคริปต์ถูกดำเนินการตรงข้ามกับที่มา
ไม่ใช่ความคิดที่ดีที่จะรวมองค์ประกอบที่ขึ้นอยู่กับสภาพแวดล้อมหรือการตั้งค่าใน repos ของคุณเป็นหนึ่งในประเด็นสำคัญของการใช้ repo อาจเป็นการแบ่งปันกับนักพัฒนาคนอื่น ๆ นี่คือวิธีที่ฉันจะตั้งค่าสภาพแวดล้อมการพัฒนาของฉันบนพีซี Windows (เช่น Win10)
เปิด Pycharm และในหน้าแรกเลือกที่จะตรวจสอบโครงการจากระบบควบคุมแหล่งที่มาของคุณ (ในกรณีของฉันฉันใช้ github)
ใน Pycharm ไปที่การตั้งค่าและเลือก "Project Interpreter" และเลือกตัวเลือกเพื่อเพิ่มสภาพแวดล้อมเสมือนใหม่คุณสามารถเรียกมันว่า "venv"
เลือกตัวแปลภาษาไพ ธ อนพื้นฐานซึ่งอยู่ที่ C: \ Users {user} \ AppData \ Local \ Programs \ Python \ Python36 (ตรวจสอบให้แน่ใจว่าคุณได้เลือกเวอร์ชันที่เหมาะสมของ Python ตามสิ่งที่คุณติดตั้งไว้)
โปรดทราบว่า Pycharm จะสร้างสภาพแวดล้อมเสมือนใหม่และคัดลอกไบนารีหลามและไลบรารีที่จำเป็นภายใต้โฟลเดอร์ venv ของคุณภายในโฟลเดอร์โครงการของคุณ
ให้ Pycharm ทำการสแกนตามที่จำเป็นในการสร้าง / รีเฟรชโครงกระดูกโครงการของคุณ
ยกเว้นโฟลเดอร์ venv จากปฏิสัมพันธ์คอมไพล์ของคุณ (เพิ่ม venv \ to .gitignoreไฟล์ในโฟลเดอร์โครงการของคุณ)
โบนัส: หากคุณต้องการให้ผู้คนติดตั้งไลบรารีทั้งหมดที่ซอฟต์แวร์ของคุณต้องการได้อย่างง่ายดาย
pip freeze > requirements.txt
และวางคำสั่งไว้ในคอมไพล์ของคุณเพื่อให้ผู้คนสามารถใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลดไลบรารี่ที่จำเป็นทั้งหมดในครั้งเดียว
pip install -r requirements.txt
หากคุณรู้ว่าระบบปฏิบัติการใดที่แอปพลิเคชันของคุณจะใช้งานฉันจะสร้าง virtualenv หนึ่งระบบสำหรับแต่ละระบบและรวมไว้ในที่เก็บของฉัน จากนั้นฉันจะทำให้แอปพลิเคชันของฉันตรวจพบว่าระบบกำลังทำงานอยู่และใช้ virtualenv ที่สอดคล้องกัน
ระบบสามารถระบุได้เช่นโดยใช้โมดูลแพลตฟอร์ม
ในความเป็นจริงนี่คือสิ่งที่ฉันทำกับแอปพลิเคชันภายในที่ฉันเขียนและฉันสามารถเพิ่ม virtualenv ของระบบใหม่ได้อย่างรวดเร็วในกรณีที่จำเป็น ด้วยวิธีนี้ฉันไม่ต้องพึ่งพา pip นั้นจะสามารถดาวน์โหลดซอฟต์แวร์ที่แอปพลิเคชันของฉันต้องการได้ ฉันจะไม่ต้องกังวลกับการรวบรวมเช่นpsycopg2ที่ฉันใช้
หากคุณไม่ทราบว่าระบบปฏิบัติการของคุณอาจใช้งานแอปพลิเคชั่นใดคุณอาจใช้pip freeze
คำแนะนำในคำตอบอื่น ๆ ได้ดีกว่า
ฉันคิดว่าดีที่สุดคือการติดตั้งสภาพแวดล้อมเสมือนในเส้นทางภายในโฟลเดอร์ที่เก็บอาจจะรวมดีกว่าที่จะใช้ไดเรกทอรีย่อยที่ทุ่มเทให้กับสภาพแวดล้อม (ฉันได้ลบโครงการทั้งหมดของฉันโดยไม่ตั้งใจเมื่อบังคับติดตั้งสภาพแวดล้อมเสมือนในรากที่เก็บข้อมูล โฟลเดอร์ที่ดีที่ฉันมีโครงการบันทึกไว้ในรุ่นล่าสุดใน Github)
ไม่ว่าจะเป็นโปรแกรมติดตั้งอัตโนมัติหรือเอกสารควรระบุเส้นทาง virtualenv เป็นเส้นทางสัมพัทธ์วิธีนี้คุณจะไม่ประสบปัญหาเมื่อแบ่งปันโครงการกับผู้อื่น เกี่ยวกับแพคเกจ, pip freeze -r requirements.txt
แพคเกจที่ใช้จะถูกบันทึกไว้โดย
หากคุณเพียงแค่ตั้งค่า env การพัฒนาให้ใช้ไฟล์ pip freeze caz ที่ทำให้ git repo ใหม่หมด
จากนั้นถ้าทำการปรับใช้การผลิตแล้วให้ตรวจสอบโฟลเดอร์ venv ทั้งหมด ซึ่งจะทำให้การปรับใช้ของคุณสามารถทำซ้ำได้มากขึ้นไม่จำเป็นต้องมีแพ็คเกจ libxxx-dev เหล่านั้นและหลีกเลี่ยงปัญหาอินเทอร์เน็ต
ดังนั้นมีสอง repos หนึ่งรายการสำหรับซอร์สโค้ดหลักของคุณซึ่งรวมถึง requirements.txt และ env repo ซึ่งมีทั้งโฟลเดอร์ venv