Husky 사용할 때 주의!

v5 버전 릴리스와 라이선스 정책 변경

자바스크립트 프로젝트의 Git hook을 작성할 때 많이 사용하는 Husky 프로젝트가 v5 버전을 새로 릴리스하면서 라이선스 정책에 일부 변화가 생겨서 사용할 때 주의가 필요해졌다. 이 글에서는 Husky 프로젝트의 어떤 점이 달라졌는지 기능과 라이선스 측면에서 알아보도록 하겠다. 또한 라이선스가 마음에 걸리는 이들을 위해 어떤 대안이 있는지도 살펴보려고 한다.

참고로 공식 릴리스 발표는 What's new in husky 5에서 볼 수 있다.

기능 변화

지난 2월 4일 Husky v5 버전이 발표되었다. 메이저 버전이 업데이트된 만큼 기능상의 변화도 많았다.

Zero dependencies

가장 첫 번째 눈에 띄는 것은 프로젝트의 의존성이 없어졌다는 것이다. 이제 husky 프로젝트는 zero dependency가 돼서 다른 패키지를 추가로 설치하지 않는다.

아름다운 zero dependency!

선택적 훅 설치

두 번째는 Git Hook을 자동으로 설치하지 않는 것이다. v5부터는 명시적으로 훅을 설치해주어야 한다고 한다. v4와 같은 방식으로 사용하려면 postinstall 스크립트에서 husky install을 실행해주면 된다.

// package.json
{
  "private": true,
  "scripts": {
    "postinstall": "husky install"
  }
}

설정 파일

기존에는 package.json이나 .huskyrc에 한꺼번에 작성했었는데 이제는 각 훅을 개별 파일로 작성하며 위치도 원하는 곳 어디에나 저장할 수 있다. 그러니까 예를 들어, .config/husky 폴더에 설정 파일을 저장하고 싶다면 다음과 같이 실행한다.

$ husky install .config/husky

이때 폴더 이름을 따로 설정하지 않으면 .husky가 기본값으로 사용된다.

새로 만든 설정 폴더에 precommit 훅의 스크립트를 작성하고 싶다면 다음과 같이 파일을 pre-commit 파일을 해당 폴더에 작성한다.

$ husky add .config/husky/pre-commit # 또는
$ husky add .config/husky/pre-commit "npm test"

첫 번째 방법처럼 작성한 뒤에 해당 경로에 있는 pre-commit 파일을 직접 수정해서 실행할 훅 스크립트를 추가해도 되고, 아니면 두 번째 방법처럼 훅 스크립트를 함께 전달해서 파일을 작성하는 방법도 있다. 두 번째 방법처럼 작성하면 pre-commit 파일의 내용은 다음과 같아진다.

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npm test

라이선스의 변화

Husky v4까지는 MIT 라이선스였기 때문에 사용하는 데 있어 아무런 제약이 없었다. 하지만 Husky v5에서는 약간의 변화가 생겼다. 현재 v5는 한시적인 기간, 조금 더 자세히 말하면 Early Access 기간에는 Parity License를 적용한다. 간단히 말해 "우리 저작물을 사용하려면 당신 저작물도 오픈하라"라는 것이다. GPL처럼 오픈하는 라이선스에 대해서는 제약을 두지 않고 있으나 결국 상업용 프로젝트에는 사용할 수 없다는 의미다.

단, Husky 프로젝트에 후원한 단체/개인에 한해서는 코드를 공개하지 않고도 사용할 수 있다. 다시 말해, Husky v5는 현재 오픈소스 혹은 프로젝트 후원자의 상업용 프로젝트에만 사용할 수 있다. 그 외의 경우에는 라이선스 위반이 된다.

Early Access 기간이 끝난 후에는 v5도 MIT 라이선스로 전환할 것이라고 한다. 그런데 공식 사이트 어디에서도 언제까지가 Early Access 기간인지 명시하지 않고 있다. 기업에서 안전하게 사용하려면 v4에 머물거나, 프로젝트를 후원하거나, 혹은 30일 무료 기간만 사용하는 방법이 있다.

문제는 지금 새 프로젝트를 작성하면서 버전 설정을 따로 하지 않고 Husky를 설치하면 v5로 설치된다는 것이다. 아무런 생각 없이 설치했다가 자신도 모르는 사이에 의도치 않게 라이선스 위반을 저지를 수 있다.

대안은 없을까?

그런데 사실 Husky의 기능은 매우 단순한 편이다. 또한 대부분 Git 자체의 기능에 의존하고 있기 때문에 굳이 Husky가 아니라도 비슷한 기능을 하는 프로젝트가 있을 것 같았다. 그래서 찾아낸 프로젝트가 node-git-hooks라는 프로젝트였다(링크).

여기도 아름다운 zero dependency!

Husky v5와 마찬가지로 의존성이 하나도 없는 단순한 프로젝트이며 심지어 사용법도 거의 비슷하다. postinstall 스크립트를 추가하여 자동으로 설치되게 하는 방식이나 별도의 폴더와 파일에 훅 스크립트를 작성하는 것도 유사하게 동작한다.

예를 들어, node-git-hooks를 사용할 때는 다음과 같이 postinstall 스크립트를 추가해줘야 한다.

// package.json
{
  "scripts": {
    "postinstall": "node-git-hooks"
  }
}

그리고 실행할 Git Hook을 .githooks 폴더에 작성하면 된다. 예를 들어 pre-commit파일을 다음과 같이 작성할 수도 있다.

# .githooks/pre-commit

npm run lint

당연히 post-commit이나 pre-push 같은 다른 훅도 작성할 수 있다.

마치며

개발자로서 나는 오픈소스를 지지하며 좋아한다. 하지만 Husky 프로젝트가 했던 것처럼 라이선스 정책을 불명확하게 갑자기 변경하여, 사용자로서 의도치 않게 라이선스 위반을 저지르게 되는 상황에 놓이는 건 달갑지 않다. 이번 일로 인해 아마 앞으로는 Husky보다 node-git-hooks를 주로 사용하게 될 것 같다. 동일한 기능을 제공하면서 단순함과 명료함을 함께 제공해주기 때문이다.

댓글을 남겨주세요

This site uses Akismet to reduce spam. Learn how your comment data is processed.