Saya bertanya-tanya apakah ada cara untuk memberitahu pip, khususnya dalam file persyaratan, untuk menginstal paket dengan versi minimum ( pip install package>=0.2
) dan versi maksimum yang tidak boleh diinstal (teoretis api:) pip install package<0.3
.
Saya bertanya karena saya menggunakan perpustakaan pihak ketiga yang sedang dalam pengembangan aktif. Saya ingin file persyaratan pip saya menentukan bahwa itu harus selalu menginstal rilis minor terbaru dari cabang 0.5.x, tapi saya tidak ingin pip pernah mencoba untuk menginstal versi utama yang lebih baru (seperti 0.6.x) karena API berbeda. Ini penting karena meskipun cabang 0.6.x tersedia, devs masih merilis tambalan dan perbaikan bug ke cabang 0.5.x, jadi saya tidak ingin menggunakan package==0.5.9
garis statis dalam file persyaratan saya.
Apakah ada cara untuk melakukan itu?
sumber
"package>=0.2,<=0.3"
tidak masuk akal: kapan Anda akan baik-baik saja dengan baik 0,2 dan 0,3,0, tetapi tidak dengan rilis perbaikan bug 0,3? Saya pikir"package>=0.2,<0.3"
ini adalah contoh yang jauh lebih baik, karena ini mencerminkan kasus umum mengatakan: "tolong beri saya rilis bugfix terbaru dari versi minor saat ini, tetapi jangan secara otomatis meningkatkan saya ke versi minor berikutnya, karena saya ingin melakukan itu secara eksplisit, memastikan bahwa tidak ada perubahan fungsional yang memengaruhi saya. "~=0.2
apakah (imho) solusi yang lebih baik dari ini.~=0.2.1
akan dilakukan, misalnya. Menjadi eksplisit seperti dalam>=0.2,<0.3
adalah hal yang baik karena sangat jelas apa yang terjadi.~=0.2.1
dalam file persyaratan. Itu kesalahan pengguna, bukan kerugian dari~=
awalan.Anda juga bisa menggunakan:
yang lebih konsisten dan mudah dibaca.
sumber
requirements.txt
IMO. Menggunakanpackage==1.*
bukannyapackage>=1.2
mencegah pip menginstal versi utama 2+ untuk paket, yang diinginkan karena perubahan versi utama sering tidak kompatibel.Metode yang elegan adalah dengan menggunakan
~=
operator rilis yang kompatibel sesuai dengan PEP 440 . Dalam kasus Anda ini akan berjumlah:Sebagai contoh, jika ada versi berikut, itu akan memilih
0.5.9
:0.5.0
0.5.9
0.6.0
Untuk klarifikasi, setiap pasangan setara:
sumber
2.2
dan masa depan yang direncanakan2.2.1
, akan~=2.2.*
cocok2.2
meskipun tidak ada nomor tersier?~=2.2.0
dalam hal itu (*
operator tidak akan bekerja jika Anda menggunakan~=
).2.2
dan2.2.0
(dan2.2.0.0
, dan seterusnya) ditangani secara internal sebagai hal yang sama ketika menginstal paket.~=1.2.3
. Jauh lebih eksplisit dan jelas untuk menggunakan formulir multi-klausul.== 1.*
akan menerima v1.1.0 dengan tidak tepat. Operator~=
(atau>=
plus<
jika Anda merasa sulit untuk membaca) lebih baik karena mendorong untuk menjadi spesifik dengan benar.== 1.*
akan gagal dan tidak melakukan apa-apa jika kita memerlukan fitur versi 1.2 tetapi pengguna sudah menginstal 1.1. Usulan Anda~= 1.2
sama dengan mengatakan>= 1.2, < 2.0
(atau>= 1.2, == 1.*
). Jadi ya Anda benar,~=
adalah operator terbaik karena memungkinkan Anda menargetkan versi pengembangan yang Anda gunakan dari perpustakaan, sambil memungkinkan versi yang lebih baru dalam versi utama yang sama . Terima kasih atas klarifikasi itu!