빌드 아티팩트를 실수로 압축하는 게 지겹나요? ‘dnx zipsrc’를 사용해 보세요!
Source: Dev.to
우리는 모두 이런 경험이 있습니다. 동료에게 프로젝트를 빠르게 공유하거나, 지원 티켓에 첨부하거나, 어딘가에 업로드해야 할 때가 있죠. 마우스 오른쪽 버튼을 클릭하고 Compress to ZIP를 선택하면… 기다립니다. 왜 이렇게 오래 걸릴까요? 파일이 500 MB라니?
아, 맞다. node_modules를 압축했군요. 아니면 bin/obj. 혹은 그 거대한 .nuget 캐시.
이제 폴더를 수동으로 제외하거나, 더 나빠서는 모든 파일을 새 위치에 복사해야 합니다. 5 초면 끝날 일이 5 분짜리 고통이 됩니다.
dnx zipsrc 소개 🎉
**dnx zipsrc**는 소스 코드만 포함하는 zip 아카이브를 생성하는 스마트 CLI 도구입니다. 빌드 출력물, 종속성 및 공유하고 싶지 않은 기타 아티팩트를 자동으로 제외합니다.
가장 좋은 점은? .NET 10의 새로운 dnx 명령을 사용하면 먼저 설치할 필요조차 없습니다!
dnx zipsrc
그게 전부입니다. 한 줄 명령만으로 소스 코드가 깔끔하게 zip 파일에 패키징되어 공유할 준비가 됩니다.
작동 방식
.gitignore를 활용한 스마트 제외
바퀴를 다시 만들 필요 없이, dnx zipsrc는 기존 .gitignore 패턴을 활용합니다. 프로젝트에 .gitignore 파일이 있으면, 해당 규칙이 자동으로 적용됩니다.
.gitignore가 없나요? 문제 없습니다! 이 도구는 dotnet new gitignore와 동등한 합리적인 기본값으로 대체되어, 일반적인 패턴을 포함합니다:
- C#/.NET –
bin/,obj/,*.user,*.suo,.vs/ - Node.js –
node_modules/,dist/,.cache/ - 그 외 다수 – 빌드 출력, IDE 파일, 로그 등.
또한 하위 디렉터리의 .gitignore 파일을 존중하고, 부정 패턴(!important-file.txt)을 올바르게 처리합니다.
내부적으로는 .NET용 강력한 .gitignore 파서 라이브러리인 GitignoreParserNet로 구동됩니다.
지능형 이름 지정
파일 이름을 고민하고 싶지 않나요? 저도 마찬가지입니다.
dnx zipsrc를 실행하면서 출력 이름을 지정하지 않으면:
- 폴더에
.sln또는.slnx파일이 있으면, 해당 솔루션 이름으로 zip 파일이 명명됩니다. - 그렇지 않으면 폴더 이름을 사용합니다.
MyProject.zip이 이미 존재한다면, 도구는 덮어쓰지 않고 자동으로 MyProject (2).zip을 생성합니다.
사용 예시
현재 디렉터리 압축
dnx zipsrc
특정 디렉터리 압축
dnx zipsrc -d ./src/MyAwesomeApp
사용자 지정 출력 이름 지정
dnx zipsrc -d ./src/MyApp -n ./archives/MyAppSource
# Creates: ./archives/MyAppSource.zip
.zip 확장자는 자동으로 추가됩니다(잊어버린 경우).
왜 dnx를 dotnet tool install 대신 사용하나요?
.NET 10은 dnx 명령을 도입했으며, 이를 통해 .NET 전역 도구를 먼저 설치하지 않고 실행할 수 있습니다. 한 번에 도구를 다운로드하고, 캐시하며, 실행합니다.
- ✅ 전역 도구 목록을 어수선하게 만들지 않음
- ✅ 항상 최신 버전을 실행
- ✅ .NET 10+가 설치된 모든 머신에서 즉시 작동
- ✅ 소스 코드를 압축하는 등 일회성 작업에 최적
자주 사용한다면, 전통적인 방법으로 여전히 설치할 수 있습니다:
dotnet tool install -g zipsrc
zipsrc -d ./MyProject
실제 사용 사례
- 📧 이메일 첨부 파일 – 불필요한 부피 없이 깔끔한 소스 코드를 공유하세요
- 🎫 지원 티켓 – 버그 보고서에 최소한의 재현 코드를 첨부하세요
- 📚 교육 – 학생들에게 시작 프로젝트를 배포하세요
- 💾 빠른 백업 – 대규모 리팩터링 전에 작업을 보관하세요
- 🤝 코드 리뷰 – 레포에 없는 팀원들과 스냅샷을 공유하세요
“하지만, 이미 존재하지 않나요?”
맞아요! 소스 코드를 압축하는 도구는 새로 만든 것이 아닙니다. 기존 옵션으로는 다음과 같은 것들이 있습니다:
- Zipper Extension – 솔루션을 압축할 수 있는 Visual Studio 애드인
- dotnet-zip-source – 비슷한 목표를 가진 .NET 전역 도구
그렇다면 왜 또 다른 도구를 만들었을까요? 제가 동기를 잡은 이유는 다음과 같습니다:
- 이름 규칙 및 출력 위치 – 기존 도구들은 의견이 반영된 기본값을 가지고 있습니다. 저는 솔루션 파일 이름을 자동으로 사용하고, 정확한 출력 위치를 제어하고 싶었습니다.
- 반복 실행 시 자동 증가 없음 –
dnx zipsrc는 자동으로(2),(3)등을 붙여 이전 아카이브를 절대 잃지 않게 합니다. - 더 나은 기본 무시 규칙 –
.gitignore파일이 없을 때 일부 도구는 최소한의 제외만 적용합니다.dnx zipsrc는dotnet new gitignore와 동등한 포괄적인 기본값을 사용합니다.
이것들은 사소해 보일 수 있지만, 하루에 여러 번 프로젝트를 압축할 경우 누적되어 큰 차이를 만들게 됩니다!
요구 사항
- .NET SDK 10.0 이상
지금 바로 시작하세요!
실수로 node_modules를 압축하는 일을 멈추고 싶나요? 다음을 실행하세요:
dnx zipsrc
GitHub에서 프로젝트 확인: jsakamoto/dnx-zipsrc
NuGet에서 설치: zipsrc on nuget.org
질문이나 피드백이 있나요? 아래에 댓글을 남기거나 GitHub에서 이슈를 열어 주세요. 즐거운 압축 되세요! 🗜️
Acknowledgments
Special thanks to Guiorgy for creating GitignoreParserNet. This library handles all the complex .gitignore parsing so I didn’t have to reinvent the wheel.
`.gitignore` parsing logic, making it easy to build tools that respect ignore patterns correctly. Open source makes building tools like this so much easier! 🙏
*This article was written with the help of VS Code and GitHub Copilot (Claude Opus 4.5 model). As a Japanese developer who is not a native English speaker, I appreciate your understanding if there are any awkward expressions!*