Virtualenv dizinimin git depomun içinde olması kötü mü?


285

Ben uygulama için git depom içinde yaptığım bir Django web uygulaması için virtualenv koyarak düşünüyorum. Konuşlandırmayı basit ve kolay tutmanın kolay bir yolu gibi görünüyor. Bunu yapmamam için bir sebep var mı?

Yanıtlar:


302

Kullandığım pip freezeBir içine ihtiyacım paketleri almak için requirements.txtdosya ve benim deposuna eklemek. Sanal arabirimin tamamını neden saklamak isteyeceğinizin bir yolunu düşünmeye çalıştım, ama yapamadım.


81
Deponuzdaki gereksiz alanı kaydedebilir ve yine de tek bir komutla yeni bir sunucuya dağıtabilirsiniz: virtualenv --no-site-Packages --distribute .env && source .env / bin / enable && pip install -r gereksinimleri.txt
RyanBrady

2
Sana bu sorunun cevabını veriyorum, çünkü bu muhtemelen "en iyi uygulama" dır ve ilk önce siz teklif ettiniz. Herkesin bahsettiği sorunlardan bazılarıyla kesinlikle karşılaştım. Ben sadece size önermek ne tüm yapmak ve pip ve bir gereksinimler dosyası kullanmadan önce kendime onunla uğraşmak başka bir gün vermek tahmin ediyorum. Yardımınız için teşekkürler!
Lyle Pratt

11
Diyelim ki pip install mysql-python, 64 bitlik bir makinede ve sonra 32 bitlik makineye sahip biri onu kullanmaya çalışırsa, çalışmaz. Performansı artırmak için birçok Python modülünün yaptığı gibi bir C modülü kullanır. Windows-> Linux'un da işe yaramayacağını hayal ediyorum.
Matt Williamson

7
sadece bir açıklama: geçmişte biraz aldık çünkü bir şekilde kütüphaneler pip'ten (sürüm çok eski) kullanılamıyor, site kapalıyken yükseltme yapmaya zorlanıyor. yani ... Şimdi bunu bir daha asla pip freezeyapmayacağım. sorun, zorla yükseltme yeniden dağıtımınız sırasında hiç kimsenin ödeme yapmaması ve ara yükseltmeler ("en iyi uygulama" bakımı) için hiç kimsenin ödeme yapmamasıdır.
SÖZLEŞME DOĞRU

5
@RayanBrady yorumu hakkında not: --distributeve --setuptoolsseçenekleri artık çalışmaz . (dağıtın, bu kurulum araçlarının bir çatalı uzun zaman önce birleştirildi). --no-site-packagesDEPRECATED, şimdi varsayılan davranış
JackNova

49

Virtualenv dizinini git içinde saklamak, belirttiğiniz gibi, sadece bir git klonu yaparak (artı Apache / mod_wsgi'yi yükleyerek ve yapılandırarak) tüm uygulamayı konuşlandırmanıza izin verir. Bu yaklaşımla ilgili potansiyel olarak önemli bir sorun, Linux'ta tam yolun venv'nin aktive, django-admin.py, easy_install ve pip betiklerinde sabit kodlanmasıdır. Bu, belki de aynı sunucuda birden fazla sanal ana bilgisayar çalıştırmak için farklı bir yol kullanmak istiyorsanız, sanalenizin tamamen çalışmadığı anlamına gelir. Web sitesi aslında bu dosyalarda yanlış yolları ile çalışabilir, ancak bir dahaki sefere pip çalıştırmak çalıştığınızda sorun olurdu düşünüyorum.

Daha önce verilen çözüm git'te yeterli bilgi depolamaktır, böylece konuşlandırma sırasında virtualenv oluşturabilir ve gerekli pip kurulumlarını yapabilirsiniz. Genellikle insanlar pip freezelisteyi almak için çalışırlar ve daha sonra listeyi gereksinimler.txt adlı bir dosyada saklarlar. İle yüklenebilir pip install -r requirements.txt. RyanBrady, konuşlandırma ifadelerini tek bir satıra nasıl bağlayabileceğinizi zaten gösterdi:

# 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

Şahsen, sadece git klonunu veya git çekmesini yaptıktan sonra çalıştırdığım bir kabuk betiğine koydum.

Virtualenv dizinini saklamak, yükseltme işleminden kaynaklanan dosyaları manuel olarak eklemek / kaldırmak ve işlemek zorunda kalacağınız için pip yükseltmelerini işlemeyi biraz daha zorlaştırır. Needs.txt dosyasıyla, sadece options.txt dosyasındaki uygun satırları değiştirir ve yeniden çalıştırırsınız pip install -r requirements.txt. Daha önce de belirtildiği gibi, bu "spam gönder" i de azaltır.


4
--Distribute'un artık kullanımdan kaldırıldığını unutmayın (en azından 15.1.0'da): --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
AnthonyC

1
--no-site-packages15.1.0'da kullanımdan kaldırıldı, çünkü bu artık varsayılan.
cjs

35

Aynı şeyi PyCrypto gibi ortama bağlı olarak farklı derlenmiş kütüphaneleri kullanmaya başlayana kadar yapardım. PyCrypto mac'um Cygwin üzerinde çalışmaz Ubuntu üzerinde çalışmaz.

Depoyu yönetmek tamamen kabus oluyor.

Her iki şekilde de pip dondurma ve bir gereksinim dosyasını tüm git sahip daha yönetmek daha kolay buldum. Bu kütüphaneler güncellendiğinden binlerce dosya için istenmeyen postalardan kaçındığınız için de daha temiz ...


Hmm. Farklı ortamlarda farklı şeyler derleme konusunda kesinlikle sorun yaşamayacağım. Muhtemelen sadece taahhüt spam önlemek için yapmaya değer muhtemelen.
Lyle Pratt

@LylePratt: Bence tam tersi: sadece PyCrypto veya PIL gibi harika araçlara sahip olma sorunlarından kaçınmak için tüm sanal havayı depoya eklememelisiniz.
Tadeck

17

Bence ortaya çıkan en önemli sorunlardan biri, virtualenv'in başkaları tarafından kullanılamayabileceğidir. Sebep, her zaman mutlak yollar kullanmasıdır. Eğer sanalenv, örneğin, /home/lyle/myenv/bu depoyu kullanan diğer tüm insanlar için aynısını varsayar (tam olarak aynı mutlak yol olmalıdır). Sizinle aynı dizin yapısını kullanan kişileri varsayamazsınız.

Daha iyi uygulama, herkesin kendi ortamını kurması (sanal ya da sanal olmayan olsun) ve kütüphaneleri oraya kurmasıdır. Bu, aynı zamanda sanal platformun her birinde farklı yüklü olması nedeniyle farklı platformlarda (Linux / Windows / Mac) kodunuzu daha kullanışlı hale getirir.


Bu, SCM'de sanal bir veri tutmanın neden kötü bir fikir olduğu konusunda doğru, ancak @ RJBrady'nin önerisi veya bir bootstrap.py komut dosyası gibi bir şeyi düşünmeye değer , çünkü aynı ortamı makineler arasında yeniden oluşturmanın bazı araçları diğer insanlarla çalışırken ciddi ihtiyaç.
ig0774

Bahsettiğiniz sorunun benim durumumda bir sorun olacağından emin değilim. Django uygulamam, virtualenv'in konumuna göre nerede olduğunu tanımlayan bir .wsgi dosyası içeriyor (2 dizin yukarı '../../env'). Yani, benim senaryomda, mutlak yol problemi beni olumsuz etkilememeli ... değil mi?
Lyle Pratt

Uygulamanızı her zaman WSGI ile çalıştırırsanız, ondan kurtulabilirsiniz. Geliştirme sunucusunu (üzerinden manage.py) kullanırsanız, kesinlikle sorunla karşılaşırsınız.
Torsten Engelbrecht

3

Temel olarak David Sickmiller'in cevabını biraz daha otomasyonla kullanıyorum. Projemin en üst düzeyinde activateaşağıdaki içeriklerle adlandırılan (yürütülebilir olmayan) bir dosya oluşturuyorum :

[ -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"

(David'in cevabına göre, bu pip freeze > requirements.txt, ihtiyaç listenizi güncel tutmak için bir yaptığınızı varsayar .)

Yukarıdaki genel fikir verir; Gerçek etkinleştirmek komut dosyası ( dokümantasyon Ben normalde kullanımı sunan biraz daha sofistike olduğunu) -qkullanılarak, (sessiz) seçeneği pythonolduğunda python3vb kullanılamaz

Bu daha sonra mevcut herhangi bir çalışma dizininden alınabilir ve gerekirse sanal ortamı ayarlayarak düzgün şekilde etkinleştirilir. Üst düzey test komut dosyamda genellikle bu satırlar boyunca kod bulunur, böylece geliştirici önce etkinleştirmek zorunda kalmadan çalıştırılabilir:

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

Kaynak bulma, burada önemli ./activatedeğildir activate, çünkü ikincisi activategeçerli dizinde bulunanı bulmadan önce yolunuzda başka birini bulur.


Bu yaklaşımı seviyorum! Kulağa çok makul geliyor, paylaştığın için teşekkürler.
Esolitos

[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }Senaryo kaynaklı değil aksine yürütülüyor olup olmadığını tespit etmek için ilk satırını değiştirmek zorunda kaldı
Chris Snow

3

Repo kullanmanın temel unsurlarından biri olarak depolarınıza çevreye bağlı herhangi bir bileşen veya ortam eklemek iyi bir fikir değildir, belki de diğer geliştiricilerle paylaşmaktır. Geliştirme ortamımı bir Windows PC'ye nasıl kuracağımı aşağıda bulabilirsiniz (örneğin, Win10).

  1. Pycharm'ı açın ve ilk sayfada, projeyi Kaynak Kontrol Sisteminizden kontrol etmeyi seçin (benim durumumda github kullanıyorum)

  2. Pycharm'da ayarlara gidin ve "Proje Tercümanı" nı seçin ve yeni bir sanal ortam ekleme seçeneğini belirleyin, buna "venv" diyebilirsiniz.

  3. C: \ Users {kullanıcı} \ AppData \ Local \ Programs \ Python \ Python36 konumunda bulunan temel python yorumlayıcısını seçin (yüklediğinize göre uygun Python sürümünü seçtiğinizden emin olun)

  4. Pycharm'ın yeni sanal ortamı oluşturacağını ve proje klasörünüzdeki venv klasörünüz altında python ikili dosyalarını ve gerekli kitaplıkları kopyalayacağını unutmayın.

  5. Pycharm'ın proje iskeletinizi yeniden oluşturması / yenilemesi gerektiğinden taramasını tamamlamasına izin verin

  6. venv klasörünü git etkileşimlerinizden hariç tutun ( proje klasörünüzdeki .gitignore dosyasına venv \ ekleyin )

Bonus: İnsanların yazılımınızın ihtiyaç duyduğu tüm kitaplıkları kolayca (iyi, neredeyse kolayca) yüklemesini istiyorsanız,

pip freeze > requirements.txt

ve gerekli tüm kütüphaneleri bir kerede indirmek için aşağıdaki komutu kullanabilmeleri için talimatı git'inize koyun.

pip install -r requirements.txt 

2

Uygulamanızın hangi işletim sistemlerinde çalışacağını biliyorsanız, her sistem için bir sanal veri oluşturacak ve veri havuzuma ekleyeceğim. Daha sonra uygulamamın üzerinde çalıştığı sistemi algılamasını ve karşılık gelen virtualenv'i kullanmasını sağlarım.

Sistem örneğin platform modülü kullanılarak tanımlanabilir .

Aslında, yazdığım bir şirket içi uygulama ile yaptığım budur ve gerektiğinde hızlı bir şekilde yeni bir sistemin sanal ekranını ekleyebilirim. Bu şekilde, pip uygulamamın başarılı bir şekilde uygulamamın gerektirdiği yazılımı indirebileceğine güvenmem gerekmiyor. Ayrıca kullandığım psycopg2 derlemesi hakkında endişelenmem gerekmeyecek .

Uygulamanızın hangi işletim sistemini çalıştırabileceğini bilmiyorsanız, muhtemelen pip freezediğer yanıtlarda önerildiği gibi kullanmaktan daha iyidir .


0

Sanırım en iyisi, sanal ortamı depo klasörünün içindeki bir yola kurmaktır, belki de ortama adanmış bir alt dizini kullanmak daha iyi olacaktır (depo köküne sanal bir ortam yüklemeye zorlarken yanlışlıkla tüm projemi sildim klasörü, projenin Github'daki en son sürümünde kaydetmiş olmam iyi oldu).

Otomatik yükleyici veya belgeler, sanal bağlantı yolunu göreceli bir yol olarak göstermelidir; bu şekilde, projeyi başkalarıyla paylaşırken sorun yaşamayacaksınız. Paketler hakkında, kullanılan paketler tarafından kaydedilmelidir pip freeze -r requirements.txt.


-1

Sadece geliştirme env'yi ayarlıyorsanız, pipo dondurma dosyasını kullanın, git repo'yu temiz yapan caz.

Daha sonra üretim dağıtımı yapıyorsanız, tüm venv klasörünü kontrol edin. Bu, dağıtımınızı daha tekrarlanabilir hale getirecek, bu libxxx-dev paketlerine gerek duymayacak ve internet sorunlarından kaçınacaktır.

Yani iki depo var. Ana kaynak kodunuz için bir tane. Ve tüm venv klasörünü içeren bir env repo.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.