RubyGems를 버리며
Vagrant 1.1+에서는 더 이상 설치 방법으로 RubyGems를 지원하지 않습니다. 대신 사전 제작된 패키지 또는 설치 프로그램을 사용하여 Vagrant 1.1+를 설치해야 합니다. gem 기반 설치에 익숙한 사람들에게는 이러한 변화로 인해 혼란과 불만이 섞인 반응이 나왔습니다. 이 글에서 저는 RubyGems를 버리게 된 이유와 이것이 장기적으로 Vagrant 커뮤니티에 더 나은 이유를 설명하겠습니다.
저는 3년 전에 처음으로 Vagrant를 RubyGem으로 배포했습니다. Vagrant는 Ruby로 작성되었고, 당시 저는 이미 RubyGem을 만드는 데 익숙했기 때문에 자연스러운 배포 방식이라고 생각했습니다.
저는 이 결정을 전혀 후회하지 않습니다. Ruby 커뮤니티는 최첨단 기술에 매우 개방적이며, RubyGem으로 배포한 것이 프로젝트의 초기 채택에 도움이 되었다고 생각합니다.
하지만 그 이후로 저는 여러 이유로 RubyGems가 더 이상 최선의 선택이 아니라는 것을 깨달았습니다.
이 글에서는 설치 프로그램이 Vagrant 사용자에게 왜 더 나은 경험을 제공하는지 설명하겠습니다. 다음 글에서는 설치 프로그램이 플러그인 개발자와 그 생태계에 미치는 영향을 설명하겠습니다.
Ruby 개발자가 아닌 사람들
2010년 Vagrant의 첫 출시 이후로 Vagrant는 수백 개 기업과 수천 명의 사람들이 사용하게 되었습니다. 정확한 수치로 뒷받침할 수는 없지만, 제가 만나는 대부분의 Vagrant 사용자는 Ruby 개발자가 아닙니다.
설치 프로그램을 만들기 전에 Vagrant에 대해 가장 많이 받았던 불만은 RubyGems에 대한 것이었습니다. Ruby를 사용하는 사람으로서 저는 항상 RubyGems가 간단하다고 생각했습니다. 하지만 Ruby 커뮤니티 밖의 사람들에게는 RubyGems를 배우고 Ruby를 설치하는 등의 부담이 진입 장벽이 되어 많은 사람들이 Vagrant 설치를 시도조차 하지 않는다는 것을 알게 되었습니다.
반면에 Vagrant의 모든 의존성(Ruby 포함)을 번들로 묶은 패키지는 Vagrant 설치를 매우 간단하게 만듭니다.
버그
Vagrant는 Ruby, RubyGems, OpenSSL, zlib, JSON 등 많은 외부 의존성이 있습니다. RubyGems 방식에서는 사용자가 이러한 의존성을 소스에서 직접 또는 선택한 패키지 관리자를 통해 수동으로 설치해야 했습니다.
이러한 유연성 때문에 저는 모든 가능한 환경에서 Vagrant를 테스트할 수 없었습니다. 제가 설치한 의존성 버전을 사용하는 제 시스템에서는 Vagrant가 작동한다는 것을 알았지만, 모든 시스템에서 작동할지는 알 수 없었습니다.
이 때문에, Vagrant를 너무 오래되었거나 버그가 있거나 권한 오류 등으로 인해 손상된 의존성과 함께 사용하면, 이로 인한 버그 보고가 자주 접수되었습니다.
이것이 제 잘못으로 여겨지든 사용자의 잘못으로 여겨지든 상관하지 않습니다. 특히 사용자가 자신의 패키지 저장소에 있는 것을 그냥 설치한 경우, 올바른 버전을 설치하지 않은 사용자를 탓하지 않습니다.
하지만 환경이 잘못되어 Vagrant가 충돌하고, 사람들이 이를 Vagrant 자체의 불안정성으로 인식하는 것은 큰 문제입니다. 사실 십중팔구 잘못 구성된 환경 때문인데도 말이죠.
설치 프로그램을 사용하면 Vagrant가 필요로 하는 모든 의존성을 함께 제공할 수 있으며, 사용자에게 해당 의존성에서 Vagrant가 작동할 것이라고 보장할 수 있습니다. 이는 특히 Windows 환경에서 유용합니다.
유연성
환경을 엄격하게 제어할 수 있기 때문에 Vagrant의 의존성을 개선하고 미세 조정할 수 있습니다.
Vagrant 1.1에서 저는 기존에 사용하던 느리고 오래된 순수 Ruby tar 라이브러리를 C로 작성된 고성능·안정적·유연한 애플리케이션이자 라이브러리인 libarchive로 교체했습니다. 이제 libarchive는 모든 Vagrant 설치 프로그램에 포함되어 제공되므로 사용자가 추가로 의존성을 설치할 필요가 없으며, Vagrant가 이를 사용하고 있다는 사실에 신경 쓸 필요도 없습니다.
Vagrant 1.2에서는 다운로더를 순수 Ruby HTTP에서 cURL을 사용하는 방식으로 교체했습니다. cURL은 훨씬 빠르고 FTP와 같은 더 많은 네트워크 프로토콜을 지원합니다. 모든 설치 프로그램에는 cURL이 미리 설치된 채로 제공됩니다. 다시 말하지만, 사용자는 신경 쓸 필요가 없습니다.
향후에는 순수 Ruby SSH 라이브러리를 C로 작성된 더 안정적이고 관리가 잘 되는 SSH 라이브러리로 교체할 예정입니다. 다시 한번, 사용자가 신경 쓸 필요는 없지만 SSH가 더 안정적으로 변한다는 것을 느끼게 될 것입니다.
이 모든 변경을 통해 사용자가 알아차리지 못하는 사이에 의존성에 큰 변화를 줄 수 있습니다. 실제로 사용자가 느끼는 것은 Vagrant 경험이 훨씬 좋아졌다는 것뿐입니다. 더 빨라지고, 충돌하지 않으며, 더 많은 기능을 지원하게 되었습니다.
전반적으로 Vagrant는 RubyGems를 통한 배포로는 안전하게 할 수 없었던 변경을 할 수 있었기 때문에 훨씬 좋아졌습니다.
글을 무작위로 읽기