JavaScript로 shell 스크립트 작성하기 😎 Google’s zx 라이브러리
JavaScript는 브라우저뿐만 아니라 Node.js 덕분에 서버에서도 자주 사용된다.
그런데 이 언어를 활용해 터미널 명령어를 실행하는 shell 스크립트를 작성할 수 있다면 얼마나 좋을까?
이런 요구사항을 Google의 zx 라이브러리가 만족한다 👍
이번엔 zx 라이브러리를 실제로 사용해본 경험을 공유하기로 했다.
zx란 ❓
zx는 Google이 개발한 Node.js 기반의 라이브러리로, JavaScript나 TypeScript를 사용하여 터미널 명령어를 실행하는 스크립트를 간단하고 직관적으로 작성할 수 있게 해준다.
✨ 따라서, shell 스크립트가 생소한 JS 개발자가 손쉽게 스크립트를 작성할 수 있게 해준다
- 기존의 스크립트와 비교했을 때 더 강력한 기능과 유연성을 제공한다.
zx의 장점 😎
- 간결한 문법
- 터미널 명령어를 JavaScript의 템플릿 리터럴(` `)로 실행할 수 있다.
- $`git commit -m "커밋 스크립트 실행하기"`;
- 복잡한 명령어를 처리하는 코드가 훨씬 읽기 쉬워진다. (JS 코드니까)
- 터미널 명령어를 JavaScript의 템플릿 리터럴(` `)로 실행할 수 있다.
- JavaScript의 생태계를 활용
- 또 다른 npm 패키지를 활용하여 복잡한 작업을 쉽게 처리할 수 있다.
- 파일 시스템 작업, HTTP 요청 등 JavaScript의 모든 기능을 사용할 수 있다.
- 때문에 더 복잡한 작업을 스크립트로 처리할 수 있게 해준다 🙌
- 비동기 처리
- 모든 명령어는 기본적으로 비동기로 실행되며, await 키워드를 사용하여 동기적으로 처리할 수 있다.
- 기존 shell 스크립트와의 친화성
- shell 스크립트를 작성하는 데 익숙한 개발자도 쉽게 적응할 수 있다.
설치 및 기본 사용법 🔭
먼저, zx를 프로젝트에 설치한다.
npm install zx
그런 다음, .mjs 확장자를 사용하는 파일을 생성하고 다음과 같이 작성한다.
#!/usr/bin/env zx
import { $ } from "zx";
// 터미널 명령어 실행
await $`echo "Hello, World!"`;
// 파일 읽기
const text = await $`cat sample.txt`;
console.log(text);
스크립트를 실행하려면 다음과 같이 입력하면 된다.
node script.mjs
ZX를 사용하면 다양한 작업을 손쉽게 스크립트로 작성할 수 있다.
예를 들면 매번 프로젝트 빌드, 테스트, 배포 과정에서 반복적인 명령어를 입력해야 한다면 시간 낭비가 심하니까 이를 해결하는 스크립트를 작성할 수 있다 👻
코드로 작성하면 다음과 같다.
#!/usr/bin/env zx
import { $ } from "zx";
// 의존성 설치
await $`npm install`;
// 테스트 실행
await $`npm test`;
// 빌드 실행
await $`npm run build`;
console.log("프로젝트 자동화 완료!");
서버관리 스크립트도 작성할 수 있다고 한다.
여러 서버에 배포하거나 설정을 변경할 때 반복 작업이 많은데, 이를 스크립트로 작성할 수 있다.
zx를 사용하면 SSH 명령어도 다음과 같이 쉽게 사용할 수 있다.
#!/usr/bin/env zx
import { $ } from "zx";
const servers = ["server1.example.com", "server2.example.com"];
for (const server of servers) {
console.log(`Deploying to ${server}...`);
await $`ssh user@${server} "cd /var/www && git pull && pm2 restart all"`;
}
console.log("배포 완료!");
CI/CD 파이프라인 스크립트도 작성할 수 있다.
물론, zx를 사용해 파이프라인을 JS를 사용해 스크립트로 작성할 수 있다.
#!/usr/bin/env zx
import { $ } from "zx";
if (process.env.BRANCH === "main") {
console.log("배포 시작...");
await $`npm run deploy`;
console.log("배포 완료!");
} else {
console.log("메인 브랜치가 아니므로 배포를 건너뜁니다.");
}
개인적으로 스크립트를 작성해본 경험이 별로 없어서 스크립트 작성에 대한 생각을 해본적이 없었는데,
zx를 사용해 친숙한 자바스크립트로 코드를 작성할 수 있으니 JS 개발자라면, 꼭 사용해봤으면 좋겠다 😊
❗ 하지만, 주의해야할 점은 zx는 node의 라이브러리이기 때문에, 기존의 shell스크립트와는 다르게 node.js의 런타임에 종속적이게 된다는 점이다. (완벽하게 shell 스크립트를 대체할 수는 없다)
✨ zx로 실제 작성한 코드 (프로젝트에 필요한 프로그램의 pre install을 도와주는 스크립트)
https://github.com/citron03/practice-next-15/blob/main/.scripts/ready-script.mjs
practice-next-15/.scripts/ready-script.mjs at main · citron03/practice-next-15
Practice React 19, Next 15 (with react compiler). Contribute to citron03/practice-next-15 development by creating an account on GitHub.
github.com