Python Rye: eksperimentinė paketų tvarkyklė

Kas yra Rye ir kodėl jis atsirado

Python ekosistemoje package management visada buvo… sakykim, sudėtingas klausimas. Turime pip, conda, poetry, pipenv, virtualenv, venv ir dar dešimtis kitų įrankių, kurių kiekvienas sprendžia skirtingas problemas skirtingais būdais. Armin Ronacher, žmogus, sukūręs Flask ir daug kitų populiarių Python projektų, nusprendė, kad gana to chaoso ir pradėjo kurti Rye – eksperimentinį package manager’į, kuris turėtų suvienodinti visą Python projektų valdymo patirtį.

Rye nėra tiesiog dar vienas package manager’is. Tai bandymas sukurti „vieną įrankį visam” – nuo Python versijos valdymo iki dependency management ir projekto kūrimo. Jei kada nors naudojote Rust ir jo cargo įrankį, tai Rye filosofija labai panaši. Vienas komandų rinkinys visam, kas reikalinga Python projektui.

Svarbu paminėti, kad pats Armin Rye vadina „eksperimentiniu” projektu. Tai reiškia, kad jis bando išbandyti naujas idėjas ir požiūrius, kurie galbūt ateityje taps standartine Python praktika, o galbūt ne. Bet būtent tokia eksperimentavimo dvasia ir stumia technologijas į priekį.

Pagrindinės Rye galimybės

Rye apjungia kelis svarbius aspektus viename įrankyje. Pirma, jis valdo pačias Python versijas. Nebereikia atskirai instaliuoti pyenv ar panašių įrankių – Rye pats atsisiunčia ir valdo skirtingas Python versijas jūsų sistemoje. Tai ypač patogu, kai dirbate su keliais projektais, kurie naudoja skirtingas Python versijas.

Antra, Rye kuria ir valdo virtualias aplinkas (virtual environments). Kiekvienas projektas automatiškai gauna savo izoliuotą aplinką, ir jums nereikia atsiminti aktyvuoti ar deaktyvuoti ją – Rye viską daro už jus. Tai gali atrodyti kaip smulkmena, bet praktikoje sutaupo nemažai nervų.

Trečia, dependency management’as paremtas šiuolaikiniais standartais. Rye naudoja pyproject.toml failą projektų konfigūracijai ir generuoja lock failus tiksliam dependency versijų fiksavimui. Jei dirbote su Poetry ar panašiais įrankiais, tai jums bus pažįstama.

Ketvirta, Rye palaiko workspace konceptą – galite valdyti kelis susijusius projektus viename workspace’e, kas ypač naudinga monorepo tipo struktūrose. Tai funkcionalumas, kurio trūksta daugeliui kitų Python įrankių.

Kaip pradėti naudoti Rye

Instaliacija yra paprasta. Linux ir macOS sistemose tiesiog paleiskite:

curl -sSf https://rye-up.com/get | bash

Windows sistemoje galite atsisiųsti installer’į iš oficialios svetainės. Po instaliacijos reikės perkrauti terminalą arba paleisti source komandą, kad PATH būtų atnaujintas.

Naujo projekto sukūrimas atrodo taip:

rye init mano-projektas
cd mano-projektas

Rye automatiškai sukurs projektą su standartine struktūra, pyproject.toml failu ir virtualią aplinką. Jei norite naudoti konkrečią Python versiją, galite nurodyti:

rye pin 3.11

Ši komanda nustatys projektui Python 3.11 versiją, ir Rye automatiškai ją atsisiųs, jei jos dar neturite sistemoje. Tai vienas iš momentų, kur Rye tikrai blizga – nebereikia rankiniu būdu ieškoti ir instaliuoti skirtingų Python versijų.

Dependency valdymas praktikoje

Pridėti naują biblioteką į projektą yra paprasta:

rye add requests

Rye atnaujins pyproject.toml failą ir sugeneruos arba atnaujins requirements.lock failą su visomis dependency ir jų versijomis. Jei norite pridėti development dependency (pvz., testing framework’us):

rye add --dev pytest

Vienas iš dalykų, kuris man asmeniškai patinka Rye – tai kaip jis sprendžia dependency konfliktus. Jis naudoja uv resolver’į (taip pat Astral komandos kūrinį), kuris yra žymiai greitesnis už tradicinį pip resolver’į. Didelių projektų atveju skirtumas gali būti labai akivaizdus.

Kai norite instaliuoti visas projekto dependencies kitoje mašinoje ar po git clone, tiesiog:

rye sync

Ši komanda užtikrins, kad jūsų aplinka atitinka lock faile nurodytas versijas. Tai garantuoja reprodukuojamumą – visi komandos nariai dirbs su tomis pačiomis dependency versijomis.

Skriptų vykdymas ir darbo eiga

Rye leidžia apibrėžti custom skriptus pyproject.toml faile. Pavyzdžiui:

[tool.rye.scripts]
test = "pytest tests/"
lint = "ruff check ."
format = "ruff format ."

Tada galite paleisti šiuos skriptus naudodami:

rye run test
rye run lint

Tai panašu į npm scripts Node.js ekosistemoje ir labai patogu standartizuoti komandų vykdymą projekte. Naujas komandos narys gali greitai sužinoti, kokios komandos prieinamos, tiesiog pažiūrėjęs į pyproject.toml.

Rye taip pat automatiškai užtikrina, kad visos komandos būtų vykdomos projekto virtualioje aplinkoje. Nebereikia atsiminti source venv/bin/activate prieš kiekvieną komandą – Rye viską tvarko automatiškai.

Workspace funkcionalumas

Jei dirbate su keliais susijusiais Python paketais, workspace funkcionalumas gali būti tikras gelbėjimas. Galite sukurti workspace, kuris apjungia kelis projektus:

[tool.rye.workspace]
members = ["pagrindinis-paketas", "utils", "api-client"]

Tada rye sync komanda sinchronizuos visus workspace narius kartu, ir galėsite lengvai dirbti su lokaliais paketų variantais be poreikio publikuoti juos į PyPI kiekvieną kartą, kai norite išbandyti pakeitimus.

Tai ypač naudinga didesnėse organizacijose, kur turite kelis tarpusavyje susijusius paketus. Vietoj to, kad kiekvienas paketas turėtų savo atskirą dependency management procesą, galite viską valdyti centralizuotai.

Kas veikia gerai ir kas ne

Po kelių mėnesių darbo su Rye galiu pasakyti, kad kai kurie dalykai tikrai veikia puikiai. Python versijų valdymas yra nepriekaištingas – niekada neturėjau problemų su skirtingų versijų instaliacija ar perjungimu. Dependency resolution’as yra greitas, ypač palyginus su tradiciniais įrankiais.

Virtualių aplinkų automatinis valdymas taip pat sutaupo daug laiko. Nebereikia galvoti apie aplinkų aktyvavimą – tiesiog paleidi rye run ir viskas veikia. Tai gali atrodyti kaip smulkmena, bet praktikoje labai pagerina developer experience.

Tačiau yra ir iššūkių. Pirmiausia, Rye vis dar yra eksperimentinis projektas, ir tai reiškia, kad kai kurie dalykai gali keistis. Dokumentacija, nors ir gera, kartais atsilieka nuo naujausių funkcijų. Bendruomenė dar nėra tokia didelė kaip Poetry ar pipenv atveju, todėl rasti atsakymus į specifines problemas gali būti sudėtingiau.

Integracijos su IDE kartais gali būti keblios. Pavyzdžiui, PyCharm ar VS Code ne visada iš karto atpažįsta Rye sukurtas virtualias aplinkas. Paprastai tai išsprendžiama rankiniu būdu nurodant interpreter’io kelią, bet automatinis atpažinimas būtų malonus priedas.

Dar vienas aspektas – jei jūsų projektas naudoja conda ar kitas specializuotas ekosistemas (pvz., scientific computing su specifinėmis binary dependencies), Rye gali būti ne idealus pasirinkimas. Jis orientuotas į „grynąjį” Python development’ą ir geriausiai veikia su paketais iš PyPI.

Ar verta išbandyti ir kam tai tinka

Rye tikrai verta išbandyti, ypač jei pradedate naują projektą ir neturite įsipareigojimų esamiems įrankiams. Jis puikiai tinka web aplikacijų kūrimui, API projektams, CLI įrankiams – bet kam, kas naudoja standartines PyPI bibliotekas.

Ypač rekomenduočiau Rye žmonėms, kurie dirba su keliais Python projektais vienu metu. Galimybė lengvai perjungti Python versijas ir turėti aiškią, standartizuotą darbo eigą visuose projektuose yra didelis privalumas. Jei kada nors buvote supainioti dėl to, kokią virtualią aplinką turite aktyvuotą ar kokia Python versija naudojama, Rye išsprendžia šias problemas.

Komandiniame darbe Rye taip pat gali būti naudingas, nes jis skatina standartizaciją. Visi naudoja tuos pačius įrankius, tas pačias komandas, ir naujiems komandos nariams lengviau įsijungti į darbą. Lock failai užtikrina, kad visi dirba su tomis pačiomis dependency versijomis, kas sumažina „works on my machine” tipo problemas.

Tačiau jei jau turite gerai veikiantį setup’ą su Poetry ar kitais įrankiais, skubėti pereiti prie Rye galbūt nereikėtų. Migracija, nors ir ne labai sudėtinga, vis tiek reikalauja laiko. Geriau palaukti, kol Rye subręs ir galbūt taps mažiau eksperimentiniu. Arba išbandykite jį naujame šoniniame projekte, kad įgautumėte patirties be rizikos sugadinti esamus darbus.

Rye filosofija – vienas įrankis visam – yra patraukli, bet Python bendruomenei gali prireikti laiko ją priimti. Mes įpratę prie modularių įrankių, kur kiekvienas daro vieną dalyką gerai. Rye bando pakeisti šią paradigmą, ir tai gali būti tiek privalumas, tiek trūkumas, priklausomai nuo jūsų darbo stiliaus ir poreikių. Eksperimentavimas su naujais įrankiais yra būtent tai, kas skatina Python ekosistemą tobulėti, tad net jei Rye netaps jūsų pagrindiniu įrankiu, jis tikrai prisideda prie diskusijos apie tai, kaip turėtų atrodyti moderni Python development patirtis.

Daugiau

tRPC: type-safe API be GraphQL