절차 지향 애플리케이션을 만들 때 흔히 고민되는 것이, 함수 로직들의 순서를 동적으로 조절하는 것이나 로직들의 선후 관계를 동적으로 재구성하는 것이 생각보다 쉽지 않다는 점입니다.
이런 부분을 효과적으로 해결하고, 명령줄 파라미터 처리나 처리 결과를 시각적으로 살펴보고 예쁘게 화면에 출력 결과를 그려주는 역할까지 돕는 멋진 라이브러리가 있어 소개합니다.
Bullseye를 이용하면 다음과 같이 콘솔 프로그램의 동작을 모듈화해서 정의할 수 있고, 선후 관계 설정도 손쉽게 할 수 있습니다.
using static Bullseye.Targets;
using static SimpleExec.Command;
Target("build", () => RunAsync("dotnet", "build --configuration Release --nologo --verbosity quiet"));
Target("test", DependsOn("build"), () => RunAsync("dotnet", "test --configuration Release --no-build --nologo --verbosity quiet"));
Target("default", DependsOn("test"));
await RunTargetsAndExitAsync(args, ex => ex is SimpleExec.ExitCodeException);
그리고 실행하면 다음과 같은 화면이 표시됩니다.
그리고 위의 코드에서 RunAsync 메서드는 SimpleExec라는 라이브러리의 기능으로, System.Diagnostics.Process 클래스를 이용해서 힘들게 처리해야 하는 외부 실행 파일 처리, 특히 표준 출력 관련 처리가 무척 손쉬워집니다.
예를 들어, robocopy라는 Windows 내장 유틸리티 (xcopy보다 더 전문적인 기능을 지원하는 복사 자동화 도구입니다.)를 다음과 같이 호출하고, 프로그램 종료 코드를 판정하는 것까지 깔끔하게 코드를 작성할 수 있습니다.
var exitCode = 0;
Run("ROBOCOPY", "from to", handleExitCode: code => (exitCode = code) < 8);
// see https://ss64.com/nt/robocopy-exit.html
var oneOrMoreFilesCopied = exitCode & 1;
var extraFilesOrDirectoriesDetected = exitCode & 2;
var misMatchedFilesOrDirectoriesDetected = exitCode & 4;
이 방면의 주제로 고민하고 계시다면 한 번 살펴보시면 좋을 것 같습니다.
덧. Bullseye의 경우, NO_COLOR 환경 변수를 지원합니다. NO_COLOR 옵션은 캠페인으로도 전개되는 활동 (https://no-color.org/)으로, 색각 이상, 광과민증을 가진 사용자들이 콘솔에 출력되는 텍스트를 읽기 어렵지 않도록 지원하는 기능도 지원합니다.