왜 나는 또 다른 Task Runner를 만들었는가

발행: (2026년 1월 17일 오후 10:24 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

기존 작업 러너의 문제점

네, 알고 있습니다—2026년에 또 다른 작업 러너가 등장했네요. 왜 그런지 설명드리겠습니다.

저는 Make 전문가가 아니지만, 누군가가 우리 Makefile에 작업을 추가해야 할 때면 제가 바로 찾아가는 사람입니다. 흔히 받는 질문들:

  • “이 타깃에 환경 변수를 어떻게 전달하나요?”
  • “탭 문자를 추가해야만 동작하는 이유가 뭔가요?”
  • .PHONY에 작업을 추가하는 것을 깜빡했어요.”

제가 매번 구글링하는 내용이 바로 그들이 구글링해야 할 내용입니다. 우리 빌드 프로세스에는 다음과 같은 스니펫이 포함됩니다:

deploy-%: guard-% check-git-clean
	@$(eval ENV := $(word 2,$(subst -, ,$@)))
	./scripts/deploy.sh $(ENV)

$(word 2,$(subst -, ,$@))를 찾아보지 않고 이해한다면, 축하합니다—Make의 난해한 변수 치환 문법을 암기한 1 % 개발자에 속합니다.

회사 내 다른 레포들은 npm 스크립트나 uv로 실행되는 커스텀 Python CLI 패키지를 사용합니다. 각 프로젝트마다 접근 방식이 다르고, npm‑script 레포들은 같은 교차‑플랫폼 문제에 직면합니다:

{
  "clean": "rm -rf dist || rmdir /s /q dist",
  "build": "NODE_ENV=production webpack || set NODE_ENV=production && webpack"
}

보기 흉하고, 깨지기 쉬우며, 여전히 무작위 엣지 케이스에서 오류가 발생합니다.

내가 원했던 것

  • 작업을 내가 생각하는 방식대로 작성하고 싶다:

    # 그냥 배포만 하면 돼
    deploy() {
        ./scripts/deploy.sh $1
    }
  • 실제 로직이 필요할 때는 Bash의 문자열 조작 악몽 대신 Python을 사용하고 싶다.

  • JSON이나 비동기 작업을 다룰 때는 Node를 사용하고 싶다.

  • 조건문 지옥 없이 교차‑플랫폼 지원을 원한다.

  • AI 에이전트가 실제로 사용할 수 있는 무언가를 제공하고 싶다(곧 자세히 설명).

run 소개

runRunfile에 간단한 함수 형태로 작업을 정의할 수 있게 해줍니다. YAML도, TOML도, $(word …) 트릭도 필요 없습니다.

예시 Runfile

# 간단한 작업은 셸로
build() cargo build --release
# 필요할 때는 Python
analyze() {
    #!/usr/bin/env python
    import json, sys
    with open(sys.argv[1]) as f:
        data = json.load(f)
        print(f"Processed {len(data)} records")
}
# Node도 가능
process() {
    #!/usr/bin/env node
    const fs = require('fs');
    console.log('Processing...');
}
# 플랫폼별 버전
# @os windows
deploy() {
    .\scripts\deploy.ps1 $1
}

# @os linux darwin
deploy() {
    ./scripts/deploy.sh $1
}

추가 설정 파일이 없습니다. 함수만 있으면 됩니다.

Model Context Protocol (MCP) 지원

run은 내장 MCP 서버를 포함하고 있어, AI 에이전트(예: Claude Code)가 프로젝트 도구를 자동으로 탐색하고 실행할 수 있습니다.

작업에 메타데이터를 추가하세요:

# @desc Deploy to specified environment
# @arg 1:environment string Target environment (staging|prod)
deploy() {
    ./scripts/deploy.sh $1
}

이제 MCP 호환 에이전트는 도구가 무엇을 하는지, 어떻게 호출해야 하는지 정확히 알게 됩니다—추측도, 장황한 Markdown 설명도 필요 없습니다.

추가 장점

  • 단일 Rust 바이너리—런타임도 없고, 수백 개 의존성을 가진 package.json도 없습니다.
  • Bash, Zsh, Fish, PowerShell용 쉘 자동 완성 제공.
  • 별도 설정 없이 모든 작업에 대한 탭 완성 지원.

시작하기

Make, Just, npm 스크립트에 만족한다면 그대로 사용해도 좋습니다. 하지만 “더 간단한 방법이 있을 거야”라고 생각해 본 적이 있다면 run을 한 번 써보세요:

brew install nihilok/tap/runfile

or

cargo install run

소스 코드는 GitHub에 있습니다. 제 문제를 해결했으니, 여러분의 문제도 해결해 줄지도 모릅니다.

Back to Blog

관련 글

더 보기 »

GitHub Actions로 Java 빌드 자동화

!Automating Java Builds with GitHub Actions의 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A...

코드 통합이란?

통합이란 무엇인가? 소프트웨어 엔지니어링에서 통합은 여러 개발자들의 다양한 코드 변경을 하나의 일관된 s...

향상된 환경 변수 UI

환경 변수 UI가 이제 공유 및 프로젝트 환경 변수 전반에 걸쳐 관리하기가 더 쉬워졌습니다. 스크롤에 소비하는 시간을 줄이고, 더 큰 hit targets를 사용할 수 있습니다,…