.NET 10 One-Shot Tool Execution - 설치 없이 도구 실행하기
.NET 10에서 개발자를 위한 새로운 기능인 One-Shot Tool Execution이 도입됩니다. 이 기능은 CI/CD 파이프라인, 일회성 스크립트 실행, 또는 시스템에 전역 설치 없이 도구를 빠르게 테스트하고 싶을 때 유용합니다. 기존의 2단계 설치-실행 과정 대신 단일 명령으로 .NET 도구를 직접 실행할 수 있으며, dnx 단축 명령도 함께 제공됩니다.
One-Shot Tool Execution이란?
One-Shot Tool Execution은 전역 또는 로컬 설치 없이 .NET 도구를 직접 실행할 수 있는 기능입니다. 기존의 설치 후 실행하는 2단계 과정 대신, 단일 명령으로 도구를 실행할 수 있습니다.
주요 활용 사례
- CI/CD 파이프라인에서 깔끔하고 재현 가능한 빌드가 필요한 경우
- 컨테이너나 임시 빌드 에이전트와 같은 임시 환경
- 설치 전 도구를 빠르게 실험해보고 싶은 경우
- 부작용 없이 특정 도구가 필요한 스크립트 및 자동화
기존 방식 vs One-Shot 실행
기존 방식
이전에는 .NET 도구를 사용하려면 먼저 설치가 필요했습니다.
# 도구를 전역으로 설치
dotnet tool install -g dotnetsay
# 그 다음 실행
dotnetsay "Hello, World!"
이 방식은 패키지를 다운로드하고, ~/.dotnet/tools/.store에 설치하고, ~/.dotnet/tools에 실행 가능한 shim을 생성하고, PATH에 추가하는 과정을 거칩니다. 정기적으로 사용하는 도구에는 적합하지만, 일회성 사용에는 과도한 방식임.
One-Shot 실행 방식
.NET 10에서는 즉시 도구를 실행할 수 있습니다.
dotnet tool exec dotnetsay "Hello, World!"
이 명령을 실행하면 확인 프롬프트가 표시됩니다.
Tool package dotnetsay@1.0.0 will be downloaded from source <source>.
Proceed? [y/n] (y): y
확인 후 도구가 즉시 다운로드되고 실행되며, 기존 방식처럼 "설치"되지 않음.
내부 동작 원리
dotnet tool exec 명령을 사용하면 다음과 같은 과정이 진행됩니다.
- 버전 해석: 버전을 지정하지 않으면 먼저 로컬 도구 매니페스트(
.config/dotnet-tools.json)를 확인함. 도구가 있으면 해당 버전을 사용하고, 없으면 NuGet.org에서 최신 버전을 가져옴 - 다운로드: 도구 패키지가 전역 NuGet 패키지 캐시(모든 NuGet 패키지가 사용하는 동일한 위치)에 다운로드됨
- 실행:
dotnet tool install과 달리 영구적인 도구 저장소 항목이나 PATH shim을 생성하지 않고 캐시에서 직접 실행됨 - 비영구성: 실행이 완료되면 다른 NuGet 작업과 공유되는 캐시된 패키지만 남고, 설치 흔적이 남지 않음
dnx 단축 명령
npx와 유사하게, .NET 10에서는 경량 래퍼 스크립트인 dnx 명령을 도입합니다.
dnx dotnetsay "Hello, World!"
dnx 스크립트는 단순히 인자를 dotnet tool exec로 전달하여 명령을 더 짧고 직관적으로 만들어 줍니다. .NET CLI를 호출하는 셸 스크립트로 구현되어 있어, 향후 SDK 업데이트에 따라 동작이 발전할 수 있음.
버전 및 소스 제어
실행할 도구의 버전을 완전히 제어할 수 있습니다.
# 특정 버전 실행
dotnet tool exec dotnetsay@1.0.0 "Hello!"
# 특정 패키지 소스에서 실행
dotnet tool exec --add-source https://api.nuget.org/v3/index.json dotnetsay
결론
일상적인 개발 워크플로우에서 자주 사용하는 도구의 경우 기존 설치 방식(dotnet tool install -g)이 여전히 더 나은 선택입니다. 그러나 CI/CD 파이프라인을 구축하거나, 컨테이너화된 환경에서 작업하거나, 도구를 설치 없이 시험해보고 싶을 때 dotnet tool exec와 dnx가 완벽한 솔루션을 제공합니다.
개발자 경험에 큰 차이를 만드는 작은 기능입니다.