Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

deno task 사용하기

Node.js에서 npm scripts처럼 Deno도 커스텀 명령어를 정의해서 사용할 수 있는 deno task를 지원한다. 이 글에서 사용하는 버전은 v1.25.2인데 deno task는 v1.20에서 도입되었고 아직은 unstable 상태라서 나중에는 사용 방법이 달라질 수 있다.

deno task를 사용하려면 Deno의 설정 파일deno.json에서 tasks를 정의해 주면 된다. 프로젝트에서 자주 사용하는 명령어를 코드로 정의해 두는 걸 좋아하는 편이라 npm scripts도 잘 사용하고 있었고 Deno에서도 마찬가지로 필요해서 정리했다.

{
  "tasks": {
    "hello": "echo 'Hello World'"
  }
}

npm scripts에 익숙하다면 이해하기는 어렵지 않다. tasks에 이름을 지정하고 사용할 명령어를 작성하면 된다.

$ deno task hello
Warning deno task is unstable and may drastically change in the future
Task hello echo 'Hello World'
Hello World

위처럼 deno task <TASK_NAME> 형식으로 실행하면 정의한 명령어를 실행할 수 있다. 앞에서 얘기한 대로 아직 unstable 상태라는 경고 메시지가 나온다.

deno task만 입력하면 정의된 태스크의 목록을 볼 수 있다.

$ deno task
Warning deno task is unstable and may drastically change in the future
Available tasks:
- hello
    echo 'Hello World'

deno task는 sh/bash 서브 셋이지만 크로스 플랫폼에서 동작하는 셸이라고 생각하면 된다. 다시 말하면 모든 명령어가 되진 않겠지만 셸을 작성하듯이 사용하면 Windows, Linux, macOS에서 다 동작하도록 Deno가 지원한다. 이는 크로스 플랫폼을 지원하기 위해 다양한 트릭을 써야 했던 npm scripts에 비해 좋은 점이다.

불리언 리스트

두 명령어를 &&로 연결하면 앞의 명령어가 exit code 0으로 성공하면 두 번째 명령어도 실행된다.

다음과 같이 success.sh라는 셸 파일을 만들어 보자.(chmod +x success.sh로 실행권한을 추가한다.)

#!/bin/bash
echo 'Success'

exit 0

이 파일을 이용해서 다음과 같이 태스크를 추가해보자.

{
  "tasks": {
    "and": "./success.sh && echo 'And'",
  }
}

이를 실행하면 ./success.sh가 성공했기 때문에 echo 'And'까지 실행된 것을 볼 수 있다. 앞의 명령어가 실패했다면(exit code가 0이 아닌 경우) And가 출력되지 않았을 것이다.

$ deno task and
Warning deno task is unstable and may drastically change in the future
Task and ./success.sh && echo 'And'
Success
And

반대로 ||를 사용하면 앞의 명령어가 성공하면 거기서 끝나고 실패하면 두번째 명령어도 실행된다.

{
  "tasks": {
    "or": "./success.sh || echo 'OR'"
  }
}

이를 실행하면 앞의 명령어가 성공했으므로 OR은 출력되지 않는다.

deno task or
Warning deno task is unstable and may drastically change in the future
Task or ./success.sh || echo 'OR'
Success


순차 리스트

앞의 명령어의 성공/실패 여부와 상관없이 여러 명령어를 이어서 실행하고 싶다면 ;를 사용하면 된다.

{
  "tasks": {
    "sequential": "./fail.sh ; echo 'Finally'",
  }
}

앞의 fail.sh는 일부러 exit code 1로 끝나도록 한 쉘 스크립트인데 순차적으로 둘다 실행된 것을 볼 수 있다. 앞의 fail.sh는 일부러 exit code 1로 끝나도록 한 셸 스크립트인데 순차적으로 둘 다 실행된 것을 볼 수 있다.

$ deno task sequential
Warning deno task is unstable and may drastically change in the future
Task sequential ./fail.sh ; echo 'Finally'
Failed
Finally


내장 명령어

deno taskcp, mv, rm, mkdir, pwd, sleep, echo, cat, exit, xargs 명령어를 내장하고 있다. 일반적인 Unix 명령어와 같아서 따로 용도를 설명할 필요는 없지만, 이 명령어는 사용하는 OS의 셸 명령어가 아니라 Deno가 지원하는 명령어라서 Windows, Mac, Linux에서도 사용할 수 있다.

{
  "tasks": {
    "copy": "cp hello.ts hello2.ts"
  }
}

위와 같이 cp 명령어를 사용해서 파일을 복사하는 태스크를 추가했다. 그리고 위 명령어가 OS의 cp가 아닌지 확인하기 위해 cp 명령어를 alias로 교체했다. 아래처럼 cp 명령어를 사용하면 복사 대신 echo가 실행되는 것을 볼 수 있다.

$ alias cp='echo'

$ cp a.txt b.txt
a.txt b.txt

이제 copy라는 태스크를 실행하면 cp 명령어를 교체했음에도 hello2.ts라는 파일이 복사된 것을 볼 수 있다.

$ deno task copy
Warning deno task is unstable and may drastically change in the future
Task copy cp hello.ts hello2.ts
2022/09/20 01:39 2022/09/20 01:39