pile·
인프라 / DevOps·vercel-blogVercel Blog·

Turborepo의 Go에서 Rust로의 점진적 포팅

Turborepo 팀이 빌드 도구를 Go에서 Rust로 완전 재작성하지 않고 점진적으로 포팅하는 전략을 택했다. Rust CLI 레이어가 기존 Go 코드를 감싸는 방식으로, 기존 동작을 유지하면서 신규 기능 개발을 병행한다. 첫 하이브리드 릴리스는 v1.7.0이다.

핵심 포인트
  • 완전 재작성 대신 점진적 포팅 선택 — 사용자 경험 저하 없이 기존 Go 코드베이스와 병행 개발이 가능하다.
  • Rust가 Go를 JSON으로 호출하는 구조 — 두 언어 간 통신에 직렬화 레이어를 두어 타입 불일치를 단순화했다.
  • Windows에서 MinGW/MSVC 충돌 — Rust 기본값(MSVC)을 MinGW로 전환하고 dunce 크레이트로 UNC 경로 문제를 해결했다.
  • Alpine Linux(musl)에서 Go의 CGo가 세그폴트 — Rust와 Go를 완전히 분리된 바이너리로 컴파일해 JSON 통신으로 격리했다.
  • 포팅 전 기존 동작을 정의하는 테스트 스위트 작성이 필수 — 이식 결과를 검증할 기준을 먼저 만들어야 한다.
상세 정리
  • 배경: Turborepo는 Go로 작성됐지만 팀은 Rust의 성능, 타입 안전성, 생태계를 위해 언어 전환을 결정했다.
  • 전략 선택 이유: 완전 재작성은 신규 기능 중단, 기능 누락 위험, 미사용 코드 버그 증가라는 세 가지 단점이 있어 점진적 포팅을 택했다.
  • 첫 번째 타깃 — 전역 turbo 명령: 사용자가 어디서나 실행할 수 있는 글로벌 CLI. Rust가 Go 바이너리를 호출하는 얇은 래퍼로 시작했다.
  • CLI 파싱 이전: --cwd 같은 인수 파싱을 Rust로 옮기고, 결과를 Go에 JSON으로 넘기는 직렬화 레이어를 추가했다.
  • Windows 문제 — 링킹 충돌: Go는 MinGW 기반인데 Rust 기본값이 MSVC라 링킹 충돌이 발생했다. Rust 컴파일 타깃을 x86_64-pc-windows-gnu(MinGW)로 강제 전환해 해결했다.
  • Windows 문제 — UNC 경로: Go와 Rust가 Windows UNC 경로를 다르게 처리해 경로 불일치가 발생했다. Rust의 dunce 크레이트로 UNC 경로를 일반 경로로 정규화해 해결했다.
  • Alpine Linux 문제: Go가 CGo를 통해 C 라이브러리에 의존하는데, Alpine은 glibc 대신 musl을 사용해 세그폴트가 발생했다. 정적 컴파일도 불가능했다.
  • Alpine 해결책 — 바이너리 분리: Go와 Rust를 완전히 분리된 바이너리로 컴파일하고 JSON 통신으로 연결했다. CGo 의존성을 Rust 레이어에 전혀 노출시키지 않는 설계다.
  • 테스트 전략: 포팅 대상 기능의 기존 동작을 정확히 정의하는 테스트를 먼저 작성해 이식 후 동작이 동일한지 검증했다.
  • 직렬화의 가치: JSON FFI는 두 언어 간 데이터 교환을 단순화하고 플랫폼 간 호환성 문제를 상당 부분 제거했다.
  • 첫 하이브리드 릴리스: v1.7.0 — Go 핵심 로직과 Rust CLI 레이어가 공존하는 상태로 배포되었다.
왜 읽나다중 언어 혼합 빌드 툴 개발이나 Go에서 Rust로의 마이그레이션을 고려하는 시스템/인프라 엔지니어에게 실전 크로스 플랫폼 함정과 설계 패턴 레퍼런스.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    대규모 도그푸딩: cdnjs를 Cloudflare 개발자 플랫폼으로 이전하다

    cdnjs는 하루 90억 요청을 처리하는 오픈소스 JS/CSS CDN으로, 전 세계 웹사이트의 12%가 의존한다. 2026년 6월, Cloudflare는 6년간 GCP에서 운영하던 발행 파이프라인을 Workers, Workflows, R2, KV, Queues, Containers, Durable Objects로 완전 전환했다. 성능 문제가 아닌 관측성·유지보수성 한계가 동인이었으며, 마이그레이션 과정에서 플랫폼 한도를 직접 끌어올렸다.

    #durable-objects#workflows#cloudflare-workers+2
  2. 인프라 / DevOps·github-engGitHub Engineering·

    Dependabot 길들이기: 업데이트 묶고, 주기 늦추고, 보안은 빠르게

    GitHub의 Dependabot은 의존성 업데이트를 자동화하지만, 기본 설정에서는 10개 업데이트 = 10개 PR이 쏟아져 메인테이너가 알림을 무시하게 된다. Microsoft의 GCToolkit 사례(578개 커밋 중 92개가 Dependabot 버전 범프)를 바탕으로, 그룹핑·주기 조절·보안 업데이트 분리 3가지 설정으로 노이즈를 줄이면서 보안 속도는 유지하는 방법을 다룬다.

    #github-actions#devops#supply-chain-security+2
  3. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    Cloudflare, 프라이버시 프로토콜 디버깅 CLI pvcli 오픈소스 공개

    Cloudflare가 OHTTP(Oblivious HTTP) 등 프라이버시 보존 프로토콜 디버깅을 위한 CLI 도구 pvcli를 오픈소스(Apache-2.0)로 공개했다. 기존에는 RFC를 참조하며 바이너리를 수작업으로 파싱해야 했는데, pvcli는 curl과 유사한 문법으로 이 과정을 단일 명령으로 줄인다. Apple Private Relay·Microsoft Edge Secure Network를 구동하는 실전 규모의 경험에서 나온 도구다.

    #rust#cli#ohttp+2