Birden çok ortam için bir requirements.txt nasıl özelleştirilir?


113

Geliştirme ve Üretim olmak üzere iki şubem var. Her birinin bağımlılıkları vardır, bazıları farklıdır. Gelişim, kendileri gelişimde olan bağımlılıklara işaret eder. Aynı şekilde Üretim için. Her bir dalın bağımlılıklarını 'requirements.txt' adlı tek bir dosyada bekleyen Heroku'ya konuşlandırmam gerekiyor.

Organize etmenin en iyi yolu nedir?

Düşündüğüm şey:

  • Her dalda bir tane olmak üzere ayrı gereksinim dosyaları bulundurun (sık sık birleşmelerde kalmalıdır!)
  • Heroku'ya hangi gereksinimler dosyasını kullanmak istediğimi söyleyin (ortam değişkeni?)
  • Dağıtım betikleri yazın (geçici dal oluşturma, gereksinim dosyasını değiştirme, yürütme, dağıtma, geçici dalı silme)

1
daha kolay dağıtım betiği: 2 dosya bulundurun. aralarında sembolik bağ kullanın.
Udy

Yanıtlar:


209

Gereksinim dosyalarınızı basamaklandırabilir ve pip'e bir dosyanın içeriğini diğerinin içine eklemesini söylemek için "-r" bayrağını kullanabilirsiniz. Gereksinimlerinizi aşağıdaki gibi modüler bir klasör hiyerarşisine ayırabilirsiniz:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

Dosyaların içeriği şöyle görünecektir:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

Heroku dışında, artık aşağıdaki gibi ortamları kurabilirsiniz:

pip install -r requirements/dev.txt

veya

pip install -r requirements/prod.txt

Heroku, proje kökünde özellikle "requirements.txt" dosyasını aradığından, yalnızca prod'u yansıtmalıdır, örneğin:

gereksinimler.txt:

# Mirrors prod
-r requirements/prod.txt

2
Heroku'da farklı ortamlar için ayrı gereksinim dosyalarının nasıl kullanılacağı sorununu görmezden geldiniz.
Ed J

30
Cevabımın bunu ele aldığına inanıyorum.
Christian Abbott

1
Hazırlama (ek hata ayıklama paketleri istediğim yer) ve üretim ortamı (bu hata ayıklama paketlerine ihtiyacım olmadığı) için Heroku'da farklı gereksinimlere sahip olmanın bir yolunu arıyordum. Maalesef, @EdJ'in dediği gibi, bu cevap buna hitap etmiyor.
Antoine Pinsard

1
Sorunuzu yanlış anlıyor olabilirim veya sorunuz belki de orijinal posterden farklıdır. Ancak açıklığa kavuşturmak için, hazırlama dalının gereksinimleri.txt "-r gereksinimleri / staging.txt" (veya benzeri) içerebilirken, üretim dalının biri "-r gereksinimleri / prod.txt" içerebilir (cevabımın sonuna bakın). Uygun dalı karşılık gelen Heroku örneğiyle senkronize edin.
Christian Abbott

2
@SohamNavadiya Ben bunu sormadım. Diyelim ki base.txtiçinde 3 paket var ve dev.txtiçinde 1 paket var (ve -r base.txt). Sanal ortamımda 4 paketin tamamı kurulu. Şimdi 5. paketi kurmak ve onu dev'de DEĞİL, temelde listelemek istiyorum, bunu nasıl yaparım? Elbette yükleyebilirim pip freeze > base.txtama bu sorunu çözmez. Daha sonra benim istemediğim 4. dev bağımlılığını tabana koyar.
Manan Mehta

11

Orijinal soru ve cevap gönderildiğinde mevcut olmayan geçerli bir seçenek, bağımlılıkları yönetmek için pip yerine pipenv kullanmaktır.

Pipenv ile pip gibi iki ayrı gereksinim dosyasını manuel olarak yönetmek artık gerekli değildir ve bunun yerine pipenv, komut satırındaki etkileşimler aracılığıyla geliştirme ve üretim paketlerini kendisi yönetir.

Hem üretimde hem de geliştirmede kullanmak üzere bir paket kurmak için:

pipenv install <package>

Yalnızca geliştirme ortamı için bir paket kurmak için:

pipenv install <package> --dev

Bu komutlar aracılığıyla pipenv, ortam yapılandırmasını iki dosyada (Pipfile ve Pipfile.lock) depolar ve yönetir. Heroku'nun mevcut Python buildpack'i pipenv'i yerel olarak destekler ve gereksinimler.txt yerine varsa Pipfile.lock'tan kendisini yapılandıracaktır.

Aracın tam dokümantasyonu için pipenv bağlantısına bakın.


5
pipenv zaman kaybıdır. Kilitleme çok uzun sürüyor.
nurettin

10
pipenv hemen hemen her yönden bozulur. Çok şey vaat ediyor, ancak çok az gemi var
ospider

5
@ospider Pipenv'i günlük bazda kullanmak ve siz ve nurettin bildirdiğiniz gibi olumsuz sorunlar yaşamıyorum. Pipenv sürüm 2018.10.13 ile çalışma. Her yönden kırık bu nedenle çok boş bir ifadedir.
Kwuite

1
@Kwuite Son cümlenin düşüncesini paylaşıyorum. Bir yorum kritik ama anlamsız olduğunda devreye girecek çok az diyalog vardır.
Christian Abbott

3
Nurettin ve ospider ile anlaşın. pipenv berbat.
Andrew Palmer

3

İhtiyacınız aynı makinedeki ortamlar arasında geçiş yapabilmekse, geçiş yapmanız gereken her ortam için farklı sanal ortam klasörleri oluşturmanız gerekebilir.

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
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.