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ı?
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:
Kullandığım pip freeze
Bir içine ihtiyacım paketleri almak için requirements.txt
dosya ve benim deposuna eklemek. Sanal arabirimin tamamını neden saklamak isteyeceğinizin bir yolunu düşünmeye çalıştım, ama yapamadım.
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.
pip freeze
yapmayacağı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.
--distribute
ve --setuptools
seçenekleri artık çalışmaz . (dağıtın, bu kurulum araçlarının bir çatalı uzun zaman önce birleştirildi). --no-site-packages
DEPRECATED, şimdi varsayılan davranış
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 freeze
listeyi 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.
--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
--no-site-packages
15.1.0'da kullanımdan kaldırıldı, çünkü bu artık varsayılan.
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 ...
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.
manage.py
) kullanırsanız, kesinlikle sorunla karşılaşırsınız.
Temel olarak David Sickmiller'in cevabını biraz daha otomasyonla kullanıyorum. Projemin en üst düzeyinde activate
aş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) -q
kullanılarak, (sessiz) seçeneği python
olduğunda python3
vb 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 ./activate
değildir activate
, çünkü ikincisi activate
geçerli dizinde bulunanı bulmadan önce yolunuzda başka birini bulur.
[[ $_ != $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ı
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).
Pycharm'ı açın ve ilk sayfada, projeyi Kaynak Kontrol Sisteminizden kontrol etmeyi seçin (benim durumumda github kullanıyorum)
Pycharm'da ayarlara gidin ve "Proje Tercümanı" nı seçin ve yeni bir sanal ortam ekleme seçeneğini belirleyin, buna "venv" diyebilirsiniz.
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)
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.
Pycharm'ın proje iskeletinizi yeniden oluşturması / yenilemesi gerektiğinden taramasını tamamlamasına izin verin
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
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 freeze
diğer yanıtlarda önerildiği gibi kullanmaktan daha iyidir .
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
.
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.