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 task
는 cp
, 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
Comments