Bagaimana Pipfile dan Pipfile.lock digunakan?

132

Tampaknya Pipfile / Pipfile.lock dimaksudkan untuk menjadi pengganti untuk requirement.txt, dalam konteks kemasan Python. Tidak ada banyak dokumentasi di luar sana tentang bagaimana ini sebenarnya bekerja, namun. Saya menemukan deskripsi yang berkembang dari pipfile pada bagian PyPi dari situs web Python di sini tapi itu cukup berantakan dan tidak menjelaskan semantik dari berbagai bagian file.

Adakah petunjuk tentang cara memahami file-file ini?

Stephen
sumber
2
Ini adalah analog langsung dari Gemfiledan Gemfile.lockdari dunia Ruby: .lockFile ini memiliki versi spesifik untuk setiap ketergantungan; yang tanpa ekstensi hanya memiliki versi yang dikenal untuk mengendalikan-manusia. Yang mengatakan, meminta penjelasan tentang sesuatu yang masih berkembang dan jauh dari yang terdefinisi dengan baik, apalagi standar, mungkin agak terlalu dini.
Charles Duffy
(Dan juga, perbedaan antara Pipfiledan requirements.txtsebagian besar yang pertama mencoba untuk mengadopsi fitur-fitur dari dunia Ruby, yaitu mampu menentukan set ketergantungan untuk beberapa lingkungan dan dengan kondisi / opsi / dll dalam satu file).
Charles Duffy
1
Sepertinya sudah dikerahkan di Heroku "memulai dengan Python" repo ( github.com/heroku/python-getting-started.git ) jadi suka atau tidak, sepertinya sudah diproduksi.
Stephen
Kena kau. Yang mengatakan - dokumen terlihat cukup solid bagi saya. Saya tidak tahu apa yang bisa saya tulis dalam jawaban yang tidak hanya menyatakan kembali mereka.
Charles Duffy
1
Jika Anda merujuk ke tautan yang saya buat di OP maka ada beberapa hal yang dihilangkan, misalnya apa artinya sebenarnya bagi sesuatu untuk berada di bagian yang disebut sumber.
Stephen

Jawaban:

166

Konsep di balik file-file ini sederhana dan analog dengan alat lain yang sudah ada, jika Anda terbiasa dengan Ruby Bundler atau Node's Npm. Pipenvadalah paket dan alat manajemen lingkungan virtual yang menggunakan file Pipfile dan Pipfile.lock untuk mencapai tujuan ini.

Pipenv menangani lingkungan virtual untuk Anda dalam satu cara standar standar (tidak diperlukan lagi aktivasi dan nonaktifkan). Di bawah ini, beberapa dasar untuk memulai, lihat lebih banyak di situs web pipenv .

Mulai

Mulai menggunakan pipenv itu mudah, dalam jenis folder proyek Anda ...

$ pipenv install

... dan jika sudah memiliki requirements.txtfile, itu akan menghasilkan Pipfilefile dengan persyaratan dan folder lingkungan virtual, jika tidak, itu akan menghasilkan Pipfilefile kosong . Jika Anda tidak menyukai atau berubah pikiran tentang sesuatu yang telah Anda instal, cukup ketik ...

$ pipenv uninstall <package>

... dan kamu baik untuk pergi. Untuk mengaktifkan lingkungan virtual yang telah dibuat pipenv, lanjutkan dengan ...

$ pipenv shell

... dan lingkungan virtual Anda akan diaktifkan. Untuk meninggalkan lingkungan ...

$ exit

... dan Anda akan kembali ke sesi terminal asli Anda.

Pipfile

File Pipfile dimaksudkan untuk menentukan persyaratan paket untuk aplikasi atau pustaka Python Anda, baik untuk pengembangan maupun eksekusi. Anda dapat menginstal paket dengan hanya menggunakan ...

$ pipenv install flask

... dan itu akan ditambahkan sebagai ketergantungan untuk penyebaran dan eksekusi atau dengan menggunakan ...

$ pipenv install --dev pytest

... dan itu akan digunakan sebagai ketergantungan untuk waktu pengembangan. Sintaks file cukup lurus ke depan, sebagai berikut.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

The Pipfile.lock dimaksudkan untuk menentukan, berdasarkan pada paket hadir di Pipfile , yang versi tertentu dari mereka harus digunakan, menghindari risiko otomatis upgrade paket yang bergantung pada satu sama lain dan melanggar ketergantungan pohon proyek Anda.

Anda dapat mengunci paket yang diinstal saat ini menggunakan ...

$ pipenv lock

... dan alat ini akan mencari folder lingkungan virtual Anda untuk menghasilkan file kunci untuk Anda secara otomatis, berdasarkan versi yang saat ini diinstal. Sintaks file tidak sejelas untuk Pipfile , jadi demi keringkasan, itu tidak akan ditampilkan di sini.

danieldeveloper001
sumber
Ini adalah jawaban yang menarik, tetapi saya pikir ketika saya bertanya saya tidak bisa mengerti apa yang sebenarnya dimaksud [[source]], seperti apakah sumber paket yang diunduh oleh pipenv atau yang lainnya? Saya kira sisa dua file sudah cukup jelas.
Stephen
1
Saya akui, saya menganggapnya membingungkan karena saya sedang mengerjakan tutorial di mana saya harus memutuskan apakah perbedaan [paket] / [paket] itu penting, atau apakah saya harus memasukkan semuanya ke dalam [paket]. (Googling untuk ini adalah apa yang membawaku ke halaman ini.) Tetapi memiliki keduanya sekaligus memasukkan barang-barang dev ke dalam [paket] membuatku marah. Saya bisa melihat mengapa permintaan harus dalam [paket].
Al Sweigart
1
Berubah, seperti yang diminta, untuk menghindari kebingungan pada paket pengembangan, terima kasih atas komentar Anda, harap itu kurang membingungkan sekarang :)
danieldeveloper001
1
Saya pikir itu ide yang baik, jika Anda ingin melacak versi paket yang sepanjang evolusi kode sumber, karena sebagian besar paket akan menjadi versi yang dibintanginya Pipfile. Jika terjadi kerusakan pada peningkatan paket, maka seseorang harus dapat memperbaikinya dengan meninjau riwayat versi paket, dan memang, salah satu pembuat perpustakaan permintaan merekomendasikan melakukannya di sini .
danieldeveloper001
1
@ Stephen, itu sebenarnya kebalikannya, seperti yang dinyatakan dalam dokumentasi instalasi pipenv Anda dapat menentukan --skip-locktanda untuk memaksanya mengabaikan Pipfile.lockfile daripada memaksanya untuk menggunakannya;)
danieldeveloper001