Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅

πŸ’Ž rv: Ruby ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свой «ядСрный Ρ€Π΅Π°ΠΊΡ‚ΠΎΡ€Β» управлСния вСрсиями ΠΈ зависимостями

ΠœΠΈΡ€ Ruby-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ дСсятилСтиями ΠΆΠΈΠ» Π² ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ Β«ΠΏΠ°Π·Π»Π° ΠΈΠ· инструмСнтов»: вСрсии языка ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· rvm ΠΈΠ»ΠΈ rbenv, зависимости ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Bundler, Π° для CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ скриптов ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π³ΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ костыли. Но Π² августС 2025 Π³ΠΎΠ΄Π° появился rv β€” инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСняСт сам ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ экосистСмС. rv написан Π½Π° Rust (Π½Π΅ случайно: быстрый старт ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы) ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚: Π”ΠΎ сих ΠΏΠΎΡ€ Ruby-сообщСство ΠΆΠΈΠ»ΠΎ Π² компромиссах: rv снимаСт всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, прСвращая Ruby Π² «лСгковСсный язык-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Β». Π― Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽ rv ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ для Ruby-ΠΌΠΈΡ€Π°. Если Ρ€Π°Π½ΡŒΡˆΠ΅ Ruby ассоциировался с Rails ΠΈ удобством, Π½ΠΎ Π½Π΅ с ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠΉ ΡΡ‚Ρ€ΠΎΠ³ΠΎΡΡ‚ΡŒΡŽ экосистСмы, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ Π½Π΅Π³ΠΎ появляСтся инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π΄ΡƒΡ…Ρƒ Π±Π»ΠΈΠΆΠ΅ ΠΊ cargo (Rust) ΠΈΠ»ΠΈ uv (Python). ОсобСнно ΠΌΠ½Π΅ ΠΈΠΌΠΏΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ идСя Β«language managerΒ», ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ большС, Ρ‡Π΅ΠΌ version manager ΠΈΠ»ΠΈ dependency manager: это шаг ΠΊ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π³Π΄Π΅ язык β€” это сСрвис, Π° Π½Π΅ Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ½Π°Ρ€Π΅ΠΉ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ². πŸ”— Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: r
ОглавлСниС

ΠœΠΈΡ€ Ruby-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ дСсятилСтиями ΠΆΠΈΠ» Π² ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ Β«ΠΏΠ°Π·Π»Π° ΠΈΠ· инструмСнтов»: вСрсии языка ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· rvm ΠΈΠ»ΠΈ rbenv, зависимости ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Bundler, Π° для CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ скриптов ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π³ΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ костыли. Но Π² августС 2025 Π³ΠΎΠ΄Π° появился rv β€” инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСняСт сам ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ экосистСмС.

πŸš€ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ rv?

rv написан Π½Π° Rust (Π½Π΅ случайно: быстрый старт ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы) ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚:

  • πŸ’Ž ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСрсиями Ruby (автоматичСская установка ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ruby 3.4.x Π·Π° ~1 сСкунду Π½Π° macOS ΠΈ Ubuntu благодаря ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ бинарям);
  • πŸ“¦ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями (Π³Π΅ΠΌΡ‹ тянутся ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π±Π΅Π· Π±ΠΎΠ»ΠΈ с ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ);
  • πŸ”§ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ окруТСния для CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (Ρ‡Π΅Ρ€Π΅Π· rv tool run ΠΈΠ»ΠΈ rvx, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ npx ΠΈΠ»ΠΈ uvx Π² Python ΠΈ JS);
  • πŸ“œ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ скриптов Β«Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ»Β» β€” Π³Π΄Π΅ .ruby-version, Gemfile ΠΈ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ исполняСмый Π±Π»ΠΎΠΊ.

⚑ ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ

Π”ΠΎ сих ΠΏΠΎΡ€ Ruby-сообщСство ΠΆΠΈΠ»ΠΎ Π² компромиссах:

  • 🐒 компиляция Ruby ΠΈΠ· исходников ΠΌΠΎΠ³Π»Π° Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹;
  • πŸ”„ Π³Π΅ΠΌΡ‹ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Π»ΠΈ ΠΈ Π»ΠΎΠΌΠ°Π»ΠΈ окруТСния;
  • 🧩 для запуска ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ gist ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ чистотой срСды.

rv снимаСт всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, прСвращая Ruby Π² «лСгковСсный язык-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Β».

πŸ› οΈ ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  • Написан Π½Π° Rust, Ρ‡Ρ‚ΠΎ обСспСчиваСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Β«bundle exec Π½Π° стСроидах»: ΠΊΠΎΠΌΠ°Π½Π΄Π° выполняСтся, Π° срСда создаётся Π½Π° Π»Π΅Ρ‚Ρƒ, с установкой Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ruby ΠΈ всСх зависимостСй.
  • Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π³Π΄Π΅ каТдая CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свой собствСнный Ruby ΠΈ Π½Π°Π±ΠΎΡ€ Π³Π΅ΠΌΠΎΠ².
ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΡƒΡŽ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ πŸ“Š для Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Ruby-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ²: rv, rvm, rbenv ΠΈ chruby β€” с Π°ΠΊΡ†Π΅Π½Ρ‚ΠΎΠΌ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΈ удобство.
ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΡƒΡŽ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ πŸ“Š для Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Ruby-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ²: rv, rvm, rbenv ΠΈ chruby β€” с Π°ΠΊΡ†Π΅Π½Ρ‚ΠΎΠΌ Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΈ удобство.

🧠 ΠœΠΎΡ‘ Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅

Π― Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽ rv ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ для Ruby-ΠΌΠΈΡ€Π°. Если Ρ€Π°Π½ΡŒΡˆΠ΅ Ruby ассоциировался с Rails ΠΈ удобством, Π½ΠΎ Π½Π΅ с ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½ΠΎΠΉ ΡΡ‚Ρ€ΠΎΠ³ΠΎΡΡ‚ΡŒΡŽ экосистСмы, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ Π½Π΅Π³ΠΎ появляСтся инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π΄ΡƒΡ…Ρƒ Π±Π»ΠΈΠΆΠ΅ ΠΊ cargo (Rust) ΠΈΠ»ΠΈ uv (Python).

ОсобСнно ΠΌΠ½Π΅ ΠΈΠΌΠΏΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ идСя Β«language managerΒ», ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π°Π²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ большС, Ρ‡Π΅ΠΌ version manager ΠΈΠ»ΠΈ dependency manager: это шаг ΠΊ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π³Π΄Π΅ язык β€” это сСрвис, Π° Π½Π΅ Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ½Π°Ρ€Π΅ΠΉ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ².

🌍 Π“Π΄Π΅ это ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ

  • πŸ‘¨β€πŸ’» быстрый старт для Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² (с Ruby-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Β«ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡΒ» Π·Π° сСкунду, Π° Π½Π΅ Π·Π° час);
  • πŸ§ͺ CI/CD-систСмы (Π±ΠΈΠ»Π΄Ρ‹ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ окруТСния ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ);
  • πŸ” ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π³Π΄Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ зависимостСй.

πŸ”— Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rv, a new kind of Ruby management tool