uv در حال بلعیدن زنجیره ابزار پایتون است — pip، virtualenv، pyenv و poetry در یک باینری Rust

زنجیره ابزار پایتون همواره شبیه دوران نوجوانی ناهنجار آن در یک اکوسیستم بالغ بوده است. برای بستهها به pip نیاز داشتید، برای ایزولهسازی به virtualenv یا venv، برای مدیریت نسخه پایتون به pyenv، و برای قفلگذاری وابستگیها به pip-tools یا poetry یا pipenv. هر ابزار یک مشکل را حل میکرد و با دیگران اصطکاک ایجاد میکرد. uv که توسط Astral در فوریه ۲۰۲۴ منتشر شد، اولین ابزاری است که همه اینها را حل میکند — و این کار را در Rust انجام میدهد، با سرعتی که نسل قبلی را انگار با اتصال دایلآپ اجرا میشده نشان میدهد.
uv در واقع جایگزین چه چیزی میشود
جدول مقایسه در اینجا مهم است زیرا uv فقط ویژگی اضافه نمیکند — ابزارها را حذف میکند:
pip install requests → uv pip install requests (۱۰ تا ۱۰۰ برابر سریعتر، بدون نیاز به تنظیمات)python -m venv .venv → uv venv (ایجاد محیط مجازی در میلیثانیه)pyenv install 3.12 → uv python install 3.12 (نصب مدیریتشده پایتون، اختصاصی به هر پروژه)poetry add requests → uv add requests (مدیریت وابستگی با uv.lock)pip-compile requirements.in → uv pip compile (تولید فایل قفل)
تصمیم کلیدی طراحی یک باینری واحد بدون وابستگی است. uv را یک بار نصب میکنید — از طریق curl -LsSf https://astral.sh/uv/install.sh | sh یا از طریق pip — و کل چرخه حیات پروژه پایتون را بدون نیاز به نصب خود پایتون مدیریت میکند.
تفاوت سرعت واقعی است
معیارهای Astral نشان میدهد uv بستهها را ۱۰ تا ۱۰۰ برابر سریعتر از pip نصب میکند. تجربه واقعی در نصبهای کوچک چندان چشمگیر نیست اما در مقیاس قابل توجه است. یک نصب سرد از یک محیط دادهکاوی (numpy, pandas, scikit-learn, matplotlib, jupyter) که با pip ۴۵ تا ۹۰ ثانیه طول میکشد، با uv در همان دستگاه زیر ۵ ثانیه انجام میشود، عمدتاً به دلیل اینکه uv دانلودها را موازی میکند و گراف وابستگی را در Rust به جای پایتون حل میکند. در سیستمهای CI که وابستگیها مکرراً از نو نصب میشوند، این تفاوت در هر اجرای خط لوله تجمیع میشود.
حلکننده وابستگی همچنین به روشهایی درست است که pip نبود. حلکننده pip در گذشته موارد مرزی داشت که وابستگیهای متضاد را بدون خطا نصب میکرد؛ حلکننده uv که از الگوریتم PubGrub (همان الگوریتم مورد استفاده مدیر بسته pub دارت) استفاده میکند، تضمین میکند اگر راه حلی وجود داشته باشد، آن را پیدا کند و اگر وجود نداشته باشد، خطایی دقیق ارائه میدهد که کدام محدودیتها با هم تضاد دارند.
فرمت uv.lock و تکرارپذیری
uv فرمت فایل قفل خود (uv.lock) را معرفی کرد که گراف وابستگی کامل و حلشده را شامل هش هر بسته ثبت میکند. این قطعه گمشدهای بود که مدیریت وابستگی پایتون را در مقیاس غیرقابل تکرار کرده بود. یک requirements.txt با وابستگیهای ترانزیتیو قفلنشده همیشه یک بمب ساعتی بود — در ماشینهای مختلف یا زمانهای مختلف متفاوت نصب میشد زیرا بستههای بالادستی بهروز میشدند. uv.lock بینپلتفرمی است و حل را بهازای هر پلتفرم رمزگذاری میکند تا همان فایل قفل روی لینوکس، مک و ویندوز بدون فایلهای قفل جداگانه برای هر سیستمعامل کار کند.
پذیرش در اکوسیستم
پذیرش uv تقریباً سریعتر از هر ابزار پایتون در حافظه اخیر بوده است. گراف وابستگی عمومی گیتهاب نشان میدهد uv در تنظیمات CI پروژههای متنباز بزرگ در عرض چند ماه پس از انتشار ظاهر شده است. مستندات رسمی FastAPI تنظیمات توسعه توصیهشده خود را در اواسط ۲۰۲۴ به uv تغییر داد. تیم Jupyter در حال ارزیابی uv برای مدیریت محیط نوتبوک است. PyPA (مرجع بستهبندی پایتون) هیچ ابزاری را بهطور رسمی تأیید نکرده است، اما چندین عضو PyPA رسماً uv را در پروژههای خود به کار گرفتهاند.
مورد باقیمانده برای poetry یا pip-tools عمدتاً سازگاری فایل قفل است — تیمهایی که فایلهای poetry.lock موجود در گردش کار خود دارند با اصطکاک مهاجرت مواجه میشوند. uv میتواند از requirements.txt و pyproject.toml وارد کند اما مستقیماً poetry.lock را مصرف نمیکند، که به این معنی است که پذیرش در پایگاههای کد بالغ نیاز به یک مرحله مهاجرت فایل قفل دارد.
مسئله Rye
Astral همچنین Rye را نگهداری میکند، یک ابزار مدیریت پروژه سطح بالاتر. رابطه بین uv و Rye اکنون روشن شده است: uv لایه پایه است و Rye در حال همگرایی به uv بهعنوان پشتیبان خود است. Armin Ronacher (سازنده Flask)، که Rye را ساخت، پروژه را با انتظار صریح به Astral منتقل کرد که uv در نهایت جایگزین آن شود. برای پروژههای جدید، توصیه مستقیماً uv است. Rye برای تیمهایی که از آن استفاده میکنند همچنان مفید است، اما کانون توسعه فعال نیست.