Bagaimana cara menyesuaikan persyaratan.txt untuk beberapa lingkungan?

112

Saya memiliki dua cabang, Pengembangan dan Produksi. Masing-masing memiliki dependensi, beberapa di antaranya berbeda. Pengembangan menunjuk ke dependensi yang dalam pengembangan itu sendiri. Begitu juga untuk Produksi. Saya perlu menerapkan ke Heroku yang mengharapkan ketergantungan masing-masing cabang dalam satu file yang disebut 'requirement.txt'.

Apa cara terbaik untuk mengatur?

Apa yang saya pikirkan:

  • Pertahankan file persyaratan terpisah, satu di setiap cabang (harus bertahan dari penggabungan yang sering!)
  • Beri tahu Heroku file persyaratan mana yang ingin saya gunakan (variabel lingkungan?)
  • Tulis skrip penerapan (buat cabang temp, ubah file persyaratan, komit, terapkan, hapus cabang temp)
Charles R.
sumber
1
lebih mudah menyebarkan skrip: pertahankan 2 file. gunakan symlink di antara mereka.
Udy

Jawaban:

208

Anda dapat menurunkan file persyaratan Anda dan menggunakan tanda "-r" untuk memberi tahu pip agar menyertakan konten satu file di dalam file lain. Anda dapat memecah kebutuhan Anda menjadi hierarki folder modular seperti ini:

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

Konten file akan terlihat seperti ini:

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
...

Di luar Heroku, Anda sekarang dapat mengatur lingkungan seperti ini:

pip install -r requirements/dev.txt

atau

pip install -r requirements/prod.txt

Karena Heroku secara khusus mencari "Requirement.txt" di root proyek, Heroku seharusnya hanya mencerminkan prod, seperti ini:

persyaratan.txt:

# Mirrors prod
-r requirements/prod.txt
Christian Abbott
sumber
2
Anda mengabaikan masalah tentang cara menggunakan file persyaratan terpisah untuk lingkungan yang berbeda di heroku.
Ed J
29
Saya yakin jawaban saya menunjukkan hal itu.
Christian Abbott
1
Saya sedang mencari cara untuk memiliki persyaratan yang berbeda di Heroku untuk pementasan (di mana saya ingin paket debug tambahan) dan lingkungan produksi (di mana saya tidak memerlukan paket debug ini). Sayangnya, seperti yang dikatakan @EdJ, jawaban ini tidak menjawab hal ini.
Antoine Pinsard
1
Saya mungkin salah paham dengan pertanyaan Anda atau mungkin pertanyaan Anda berbeda dari poster asli. Tetapi untuk klarifikasi, persyaratan cabang pementasan dapat berisi "-r persyaratan / pementasan.txt" (atau serupa), sedangkan cabang prod dapat berisi "-r persyaratan / prod.txt" (lihat akhir jawaban saya). Sinkronkan cabang yang sesuai ke instance Heroku yang sesuai.
Christian Abbott
2
@SohamNavadiya Bukan itu yang saya tanyakan. Katakanlah saya memiliki base.txtdengan 3 paket di dalamnya, dan dev.txtdengan 1 paket di dalamnya (dan -r base.txt). SEMUA 4 paket diinstal di lingkungan virtual saya. Sekarang saya ingin menginstal paket ke-5 dan mendaftarnya di base, BUKAN di dev, bagaimana cara melakukannya? Tentu, saya dapat menginstalnya dan pip freeze > base.txtitu TIDAK menyelesaikan masalah. Ini kemudian menempatkan ketergantungan dev ke-4 di basis yang tidak saya inginkan.
Manan Mehta
11

Opsi yang layak saat ini yang tidak ada saat pertanyaan dan jawaban asli diposting adalah menggunakan pipenv alih-alih pip untuk mengelola dependensi.

Dengan pipenv, mengelola dua file persyaratan terpisah secara manual seperti dengan pip tidak lagi diperlukan, dan sebagai gantinya pipenv mengelola paket pengembangan dan produksi itu sendiri melalui interaksi pada baris perintah.

Untuk menginstal paket untuk digunakan dalam produksi dan pengembangan:

pipenv install <package>

Untuk menginstal paket hanya untuk lingkungan pengembangan:

pipenv install <package> --dev

Melalui perintah tersebut, pipenv menyimpan dan mengelola konfigurasi lingkungan dalam dua file (Pipfile dan Pipfile.lock). Buildpack Python Heroku saat ini secara native mendukung pipenv dan akan mengonfigurasi dirinya sendiri dari Pipfile.lock jika ada, bukan Requirement.txt.

Lihat tautan pipenv untuk dokumentasi lengkap alat tersebut.

Christian Abbott
sumber
4
pipenv hanya membuang-buang waktu. Penguncian terlalu lama.
nurettin
9
pipenv rusak di hampir semua aspek. Ini menjanjikan banyak, tetapi pengiriman sangat sedikit
ospider
5
@ospider Menggunakan pipenv setiap hari dan saya tidak mengalami masalah negatif seperti yang Anda dan nurettin laporkan. Bekerja dengan pipenv versi 2018.10.13. Dengan demikian, rusak dalam semua aspek adalah pernyataan yang sangat kosong.
Kwuite
1
@Kwuite Saya berbagi sentimen kalimat terakhir Anda. Ada sedikit dialog yang bisa dilakukan ketika sebuah komentar kritis namun kosong.
Christian Abbott
3
Setuju dengan nurettin dan ospider. pipenv sangat buruk.
Andrew Palmer
3

Jika kebutuhan Anda adalah untuk dapat beralih antar lingkungan pada mesin yang sama, mungkin perlu membuat folder virtualenv yang berbeda untuk setiap lingkungan yang Anda perlukan untuk beralih.

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. 
nurettin
sumber