क्या यह खराब है कि मेरी virtualenv डायरेक्टरी मेरे git रिपॉजिटरी के अंदर है?


285

मैं एक Django वेब ऐप के लिए virtualenv डालने के बारे में सोच रहा हूं जो मैं ऐप के लिए अपने गिट रिपॉजिटरी के अंदर बना रहा हूं। यह तैनाती के सरल और आसान रखने के लिए एक आसान तरीका की तरह लगता है। क्या कोई कारण है कि मुझे ऐसा क्यों नहीं करना चाहिए?

जवाबों:


302

मैं pip freezeउन पैकेजों को प्राप्त करने के लिए उपयोग करता हूं जिनकी मुझे एक requirements.txtफ़ाइल में आवश्यकता होती है और उन्हें मेरे भंडार में जोड़ते हैं। मैंने एक तरीका सोचने की कोशिश की कि आप पूरे वर्चुअन को क्यों स्टोर करना चाहते हैं, लेकिन मैं नहीं कर सका।


81
आप अपने रेपो में अनावश्यक स्थान को बचा सकते हैं और अभी भी एक ही कमांड में एक नए सर्वर पर तैनात कर सकते हैं: virtualenv --no-site-package --distribute .env && source .env / bin / activate && pip -r आवश्यकताएँ आवश्यकताएँ ..t।
रयान ब्रैडी

2
मैं आपको इस प्रश्न का उत्तर दे रहा हूं, क्योंकि यह संभवतः "सबसे अच्छा अभ्यास" है और आपने इसे पहले पेश किया था। मैंने निश्चित रूप से कुछ समस्याओं का सामना किया है, जिनका सभी ने उल्लेख किया है। मैं अनुमान लगा रहा हूं कि मैं अपने साथ एक और दिन दे रहा हूं, इससे पहले कि मैं सिर्फ वही करूं जो आप लोग कर रहे हैं। आपकी सहायताके लिए धन्यवाद!
लील प्रैट

11
यदि आप कहते हैं pip install mysql-python, 64 बिट मशीन पर, और फिर 32 बिट मशीन वाला कोई व्यक्ति इसका उपयोग करने की कोशिश करता है, तो यह काम नहीं करेगा। यह C मॉड्यूल का उपयोग करता है, जैसे कई पायथन मॉड्यूल प्रदर्शन को बढ़ाने के लिए करते हैं। मुझे लगता है कि विंडोज-> लिनक्स भी काम नहीं करेगा।
मैट विलियमसन

7
बस एक टिप्पणी: हमें अतीत में थोड़ा सा मिला क्योंकि किसी भी तरह से लाइब्रेरी पाइप (संस्करण बहुत पुरानी) से अनुपलब्ध हो रही है, साइट के डाउन होने के दौरान अपग्रेड के लिए मजबूर किया गया। इसलिए ... मैं अब pip freezeऐसा करने के लिए फिर कभी भरोसा नहीं करूंगा । मुद्दा यह है कि आपके जबरन नवीनीकरण के दौरान, कोई भी इसके लिए भुगतान नहीं करता है, और मध्यवर्ती उन्नयन ("सर्वोत्तम अभ्यास" रखरखाव) के लिए कोई भी नहीं करता है।
अनुबंधित SAYS I’m I’m RIGHT

5
@RayanBrady टिप्पणी पर ध्यान दें: --distributeऔर --setuptoolsविकल्प अब नो-ऑप हैं। (वितरित करें, कि सेटप्टूल का एक कांटा बहुत पहले विलय कर दिया गया है)। --no-site-packages
DEPRECated

49

Git के अंदर virtualenv डायरेक्टरी को स्टोर करना, जैसा कि आपने नोट किया है, आपको सिर्फ एक गिट क्लोन (प्लस अपाचे / mod_wsgi को स्थापित करने और कॉन्फ़िगर करने) द्वारा पूरे ऐप को तैनात करने की अनुमति देता है। इस दृष्टिकोण के साथ एक संभावित रूप से महत्वपूर्ण मुद्दा यह है कि लिनक्स पर पूर्ण पथ को vev के सक्रिय, django-admin.py, easy_install और pip स्क्रिप्ट में हार्ड-कोडित किया जाता है। इसका अर्थ है कि यदि आप एक ही पथ पर एक से अधिक वर्चुअल होस्ट्स चलाना चाहते हैं, तो आपका virtualenv पूरी तरह से काम नहीं करेगा। मुझे लगता है कि वेबसाइट वास्तव में उन फाइलों में गलत रास्तों के साथ काम कर सकती है, लेकिन अगली बार जब आपने पाइप चलाने की कोशिश की तो आपको समस्या होगी।

समाधान, पहले से ही दिया गया है, गिट में पर्याप्त जानकारी संग्रहीत करने के लिए है ताकि तैनाती के दौरान आप वर्चुअन बना सकें और आवश्यक पाइप डिस्क कर सकें। आमतौर पर लोग pip freezeसूची प्राप्त करने के लिए दौड़ते हैं, फिर इसे आवश्यकताओं के नाम से एक फ़ाइल में संग्रहीत करते हैं। इसके साथ लोड किया जा सकता है pip install -r requirements.txt। रयान ब्रैडी पहले ही दिखा चुके हैं कि आप एक ही लाइन में तैनाती स्टेटमेंट को कैसे स्ट्रिंग कर सकते हैं:

# 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

व्यक्तिगत रूप से, मैंने इन्हें केवल एक शेल स्क्रिप्ट में रखा है जिसे मैं गिट क्लोन या गिट पुल करने के बाद चलाता हूं।

Virtualenv निर्देशिका को संग्रहीत करना भी पाइप अपग्रेड को संभालने के लिए इसे थोड़ा पेचीदा बनाता है, क्योंकि आपको मैन्युअल रूप से अपग्रेड से परिणामी फ़ाइलों को जोड़ना / निकालना होगा। आवश्यकताओं के साथ। फ़ाइल के साथ, आप आवश्यकताओं में उचित लाइनों को बदल देते हैं pip install -r requirements.txt। फिर से और फिर से चलाएँ । जैसा कि पहले ही उल्लेख किया गया है, यह "कमिट स्पैम" भी करता है।


4
ध्यान दें कि --distribute अब पदावनत हो गया है (कम से कम 15.1.0 में): --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
AnthonyC

1
--no-site-packages15.1.0 के रूप में अच्छी तरह से डिफ़ॉल्ट के रूप में पदावनत किया गया है।
cjs

35

जब तक मैंने पुस्तकालयों का उपयोग शुरू नहीं किया, तब तक मैं ऐसा ही करता था, जो कि पर्यावरण पर निर्भर करता है जैसे कि PyCrypto। मेरा PyCrypto mac, उबंटू पर काम नहीं करेगा।

यह भंडार का प्रबंधन करने के लिए एक बुरा सपना बन जाता है।

किसी भी तरह से मुझे पाइप फ्रीज़ और आवश्यकताओं की फाइल को आसानी से प्रबंधित करने की तुलना में यह सब मिल गया। यह बहुत साफ है क्योंकि आपको हजारों फाइलों के लिए प्रतिबद्ध स्पैम से बचना है क्योंकि उन पुस्तकालयों को अद्यतन किया जाता है ...


हम्म। मुझे निश्चित रूप से अलग-अलग वातावरणों में अलग-अलग संकलित किए जाने वाले सामानों की समस्या नहीं होगी। मुझे लगता है कि इसकी कीमत शायद कमिट स्पैम से बचने के लिए नहीं है।
लाइल प्रैट

@LylePratt: मुझे लगता है कि इसके विपरीत: बेहतर है कि इस तरह के महान उपकरण PyCrypto या PIL जैसे मुद्दों से बचने के लिए रिपॉजिटरी में पूरे virtualenv को शामिल न करें।
टेडेक

17

मुझे लगता है कि एक मुख्य समस्या यह है कि virtualenv अन्य लोगों द्वारा उपयोग करने योग्य नहीं हो सकता है। कारण यह है कि यह हमेशा पूर्ण पथ का उपयोग करता है। इसलिए यदि आप virtualenv उदाहरण के लिए था, तो /home/lyle/myenv/इस रिपॉजिटरी का उपयोग करने वाले अन्य सभी लोगों के लिए समान होगा (यह बिल्कुल एक ही निरपेक्ष पथ होना चाहिए)। आप उसी निर्देशिका संरचना का उपयोग करके लोगों को अनुमान नहीं लगा सकते हैं।

बेहतर अभ्यास यह है कि हर कोई अपने स्वयं के वातावरण को स्थापित कर रहा है (यह virtualenv के साथ या इसके बिना हो) और वहां पुस्तकालय स्थापित कर रहा है। यह भी आपको विभिन्न प्लेटफार्मों (लिनक्स / विंडोज / मैक) पर अधिक प्रयोग करने योग्य बनाता है, क्योंकि उनमें से प्रत्येक में वर्चुअनव अलग-अलग स्थापित है।


यह सही है कि क्यों SCM में virtualenv रखना एक बुरा विचार है, लेकिन यह @ RJBrady के सुझाव या इवेंट को बूटस्ट्रैपहोम स्क्रिप्ट की तरह कुछ मानने लायक है , क्योंकि मशीनों में समान वातावरण को फिर से बनाने का कुछ साधन है। अन्य लोगों के साथ काम करते समय गंभीर आवश्यकता।
ig0774

मुझे वास्तव में यकीन नहीं है कि आपके द्वारा बताई गई समस्या मेरी स्थिति में बिल्कुल समस्या होगी। मेरे Django ऐप में एक .wsgi फ़ाइल है जो परिभाषित करती है कि virtualenv यह स्थान के सापेक्ष है (2 निर्देशिका ऊपर '../../env')। तो, मेरे परिदृश्य में, पूर्ण पथ की समस्या मुझे नकारात्मक रूप से प्रभावित नहीं करना चाहिए ... सही?
लाइल प्रैट

यदि आप अपने ऐप को हमेशा WSGI के साथ चलाते हैं तो आप इससे दूर हो सकते हैं। यदि आप विकास सर्वर का उपयोग करते हैं (तो manage.py) आप समस्याओं के बारे में सुनिश्चित करेंगे।
टॉरस्टेन एंगेलब्रैच

3

मैं थोड़ा और अधिक स्वचालन के साथ मूल रूप से डेविड सिकमिलर के उत्तर का उपयोग करता हूं । मैं अपने प्रोजेक्ट के शीर्ष स्तर पर (गैर-निष्पादन योग्य) फ़ाइल बनाता हूं जिसका नाम 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; }पता लगाने के लिए पहली पंक्ति को बदलना पड़ा कि क्या पटकथा को विरोध के रूप में क्रियान्वित किया जा रहा था
क्रिस स्नो

3

किसी भी पर्यावरण-निर्भर घटक को शामिल करना या रेपो का उपयोग करने के प्रमुख पहलुओं में से एक के रूप में अपने रिपॉज में शामिल करना एक अच्छा विचार नहीं है, शायद, यह अन्य डेवलपर्स के साथ साझा कर रहा है। यहां बताया गया है कि मैं अपने विकास के माहौल को विंडोज पीसी पर कैसे सेट करूंगा (कहते हैं, Win10)।

  1. Pycharm खोलें और पहले पृष्ठ पर, अपने स्रोत नियंत्रण प्रणाली से परियोजना की जांच करना चुनें (मेरे मामले में, मैं स्मिथ का उपयोग कर रहा हूं)

  2. Pycharm में, सेटिंग में नेविगेट करें और "प्रोजेक्ट इंटरप्रेटर" चुनें और एक नया आभासी वातावरण जोड़ने का विकल्प चुनें, आप इसे "वेनव" कह सकते हैं।

  3. आधार पायथन इंटरप्रेटर चुनें जो C: \ Users {user} \ AppData \ Local \ Programs \ Python \ Python36 पर स्थित है (सुनिश्चित करें कि आपने जो इंस्टॉल किया है, उसके आधार पर आप Python का उपयुक्त संस्करण चुनें)

  4. ध्यान दें कि Pycharm नया वर्चुअल वातावरण बनाएगा और अपने प्रोजेक्ट फ़ोल्डर के अंदर अपने venv फ़ोल्डर के तहत अजगर बायनेरिज़ और आवश्यक पुस्तकालयों की प्रतिलिपि बनाएँ।

  5. Pycharm को अपनी स्कैनिंग पूरी करने दें क्योंकि उसे आपके प्रोजेक्ट कंकाल को फिर से बनाने / ताज़ा करने की आवश्यकता है

  6. अपना Git बातचीत (venv \ में जोड़ने से venv फ़ोल्डर को बाहर .gitignore अपनी परियोजना फ़ोल्डर में फ़ाइल)

बोनस: यदि आप चाहते हैं कि लोग आसानी से (अच्छी तरह से, लगभग आसानी से) सभी पुस्तकालयों को आपके सॉफ़्टवेयर की ज़रूरतों को स्थापित करें, तो आप उपयोग कर सकते हैं

pip freeze > requirements.txt

और अपने git पर निर्देश डालें ताकि लोग एक ही समय में सभी आवश्यक पुस्तकालयों को डाउनलोड करने के लिए निम्न कमांड का उपयोग कर सकें।

pip install -r requirements.txt 

2

यदि आप जानते हैं कि आपका एप्लिकेशन किन ऑपरेटिंग सिस्टमों पर चल रहा है, तो मैं प्रत्येक सिस्टम के लिए एक वर्चुअन बनाऊंगा और इसे अपने रिपॉजिटरी में शामिल करूंगा। फिर मैं अपने एप्लिकेशन का पता लगाऊंगा कि यह किस सिस्टम पर चल रहा है और संबंधित virtualenv का उपयोग करें।

सिस्टम को प्लेटफ़ॉर्म मॉड्यूल का उपयोग करके पहचाना जा सकता है ।

वास्तव में, यह वही है जो मैं एक इन-हाउस एप्लिकेशन के साथ करता हूं जो मैंने लिखा है, और जिस पर मैं जरूरत पड़ने पर एक नई प्रणाली के वर्चुअन को जल्दी से जोड़ सकता हूं। इस तरह, मुझे उस पर भरोसा करने की ज़रूरत नहीं है कि जिस पाइप को मेरे आवेदन की आवश्यकता है, उसे सफलतापूर्वक डाउनलोड करने में सक्षम होगा। मैं भी मानस psopopg2 जो मैं उपयोग के संकलन के बारे में चिंता करने की ज़रूरत नहीं होगी ।

यदि आप नहीं जानते हैं कि आपका एप्लिकेशन किस ऑपरेटिंग सिस्टम पर चल सकता है, तो आप संभवतः pip freezeअन्य उत्तरों में सुझाए गए उपयोग से बेहतर हैं।


0

मुझे लगता है कि रिपॉजिटरी फ़ोल्डर के अंदर एक पथ में आभासी वातावरण को स्थापित करने के लिए सबसे अच्छा है, शायद पर्यावरण के लिए समर्पित एक उपनिर्देशिका का उपयोग करने के लिए बेहतर है (जब मैंने भंडार में एक आभासी वातावरण स्थापित करने पर बलपूर्वक गलती से मेरी पूरी परियोजना को हटा दिया है फ़ोल्डर, अच्छा है कि मैं अपने नवीनतम संस्करण Github में सहेजा गया था)।

या तो स्वचालित इंस्टॉलर, या प्रलेखन को वर्चुअलएनव पथ को एक सापेक्ष पथ के रूप में इंगित करना चाहिए, इस तरह आप अन्य लोगों के साथ प्रोजेक्ट साझा करते समय समस्याओं में नहीं चलेंगे। पैकेजों के बारे में, उपयोग किए जाने वाले पैकेजों को सहेजना चाहिए pip freeze -r requirements.txt


-1

यदि आप सिर्फ विकास एनवी की स्थापना कर रहे हैं, तो पाइप फ्रीज़ फ़ाइल, काज का उपयोग करें जो गिट रेपो को साफ करता है।

फिर यदि उत्पादन परिनियोजन करते हैं, तो पूरे venv फ़ोल्डर की जांच करें। यह आपकी तैनाती को और अधिक प्रतिलिपि प्रस्तुत करने योग्य बना देगा, न कि उन libxxx-dev संकुल की जरूरत है, और इंटरनेट के मुद्दों से बचें।

तो दो रिपोज हैं। आपके मुख्य स्रोत कोड के लिए एक, जिसमें एक आवश्यकताएँ शामिल हैं। और एक एनवी रेपो, जिसमें पूरा वीवी फोल्डर होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.