- turborepo에서 yarn은 pnp 모드를 지원하지 않아서 pnpm으로 선택
- lerna는 yarn, terborepo는 pnpm을 사용하는 느낌 같음
pnpm dlx create-turbo@latest
자세한 내용은 터보 레포에 대해서 정리한 포스팅 crafting terborepo 요약 참고
corepack enable
npm install -g pnpm
pnpm -v
package.json에 있는 packageManager 버전을 쓰면 된다.
packageManager 속성이 있으면 설치된 버전에 상관없이 명시되어있는 버전으로 변경된다.
{ "packageManager": "[email protected]" }
mkdir ./nvmrc
echo "v20.12.1" > .nvmrc
window는 (.bashrc에 alias 넣어두자)
nvm use $(cat .nvmrc)
unix 계열은
nvm use
turbo repo storybook guide design system git
mkdir apps/storybook
cd apps/storybook
pnpm dlx storybook@latest init
=> react + vite로 생성함
설치하고 온보딩 에드온 제거
@repo/ui 패키지를 storybook에 추가하기
pnpm install @repo/ui --filter=storybook
pnpm install @repo/config-eslint --save-dev --filter=storybook
pnpm install @repo/config-ts --save-dev --filter=storybook
app/storybook/package.json의 dependincies에 직접 추가해줘도 됨 똑같음
(대신 추가하고 pnpm install
꼭 해주기!)
{
"dependencies": {
"@repo/ui": "workspace:^",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}
}
패키지를 제공하는 쪽에서 빌드해서 컴포넌트를 제공해야하고
빌드하지 않고 쓸 경우 패키지를 사용하는 쪽에서 alias 설정을 해줘야함
이렇게 설치
pnpm install --save-dev -w @commitlint/cli @commitlint/config-conventional
@commitlint/config-conventional
: angular commit message convention을 사용한다.
(feat: foo
fix: bar
이런 느낌)
그리고 이렇게 설정했다.
// commitlint.config.mjs
import { GIT_COMMIT_CONFIGURATION } from './scripts/generate_commit_msg_template.mjs';
const Configuration = {
extends: ['@commitlint/config-conventional'],
rules: {
'header-max-length': [2, 'always', 72],
'body-leading-blank': [2, 'always'],
'body-max-line-length': [2, 'always', 80],
},
};
export default Configuration;
한글을 사용하고 싶다면, 플러그인을 직접 만들자.
const Configuration = {
extends: ['@commitlint/config-conventional'],
rules: {
'subject-case': [2, 'never', ['upper-case', 'pascal-case', 'start-case']],
'header-max-length': [2, 'always', 72],
'body-leading-blank': [2, 'always'],
'body-max-line-length': [2, 'always', 225],
'footer-leading-blank': [2, 'always'],
'type-enum-kor': [2, 'always', ['기능', '버그', '개선']],
'type-empty-kor': [2, 'always'],
'type-enum': [0, 'always'], // 영어만 입력 받는거 무시
'type-empty': [0, 'always'], // 한글 입력시 empty 에러 무시
'subject-empty': [0, 'always'], // 한글 입력시 empty 에러 무시
},
plugins: [{ rules: { 'type-enum-kor': typeEnumWithKor, 'type-empty-kor': typeEmptyWithKor } }],
// prompt: PROMPT_CONFIGURATION, // 이거는 대화형으로 커밋 메시지를 작성할 때 사용하는 옵션인데 윈도우에서 작동에 문제가 있음
};
export default Configuration;
function typeEnumWithKor(value) {
const { header, always, ...rest } = value;
const type = header.split(':')[0].split('(')[0];
const keys = ['기능', '버그', '개선'];
return [keys.some((t) => t === type), '다음 중 하나를 선택해주세요: ' + keys.join(', ')];
}
function typeEmptyWithKor(value) {
const { header, always, ...rest } = value;
const regex = /^[가-힣a-zA-Z]+\([가-힣a-zA-Z0-9]*\)!?:\s[^\s]+.*|^[가-힣a-zA-Z]+!?:\s[^\s]+.*$/;
const isMatched = regex.test(header);
return [isMatched, '머릿말을 양식에 맞게 작성해주세요 (예: "feat(comments): message", "fix(bug): message" )'];
}
대화형 구성은 unix 계열에서만 하는게 좋다.
window 환경은 건강에 좋지 않다.
commitlint prompt여기를 참고
cz-customizable을 사용해서 구성할 계획이면 다음 링크를 참고
commitlint/issues/2684
blog cz-customizable
pre-commit을 Inquirer로 hooking하여 대화형으로 구성하는 방법도 있다.
git config commit.template <file>
로 설정하면 된다.
// script.js
const GIT_COMMIT_TEMPLATE = `
# NOTE:
# 다음 형태로 커밋 메시지를 작성해주세요.
# <타입>[적용 범위(선택 사항)]: <설명>
#
#[본문(선택 사항)]
#
#[꼬리말(선택 사항)]
#
# EXAMPLE:
# fix(libraryName) : 사용하지 않는 구식 라이브러리 제거
#
# 저녁 매뉴 추천 받습니다.
# 주말엔 놀고 싶어요.
#
# - nodejs 버전이 올라가면서 사용하지 않는 라이브러리를 제거
# - newLibararyName으로 통합
# - libraryName를 사용중인 경우 newLibararyName으로 변경 필요
#
# Resolves: #123, #245
# Closes issue by #123
# Pull request: #123
# Refs: 676104e, a215868
# REFERENCE:
# https://github.com/angular/angular/blob/68a6a07/CONTRIBUTING.md#commit
# https://www.conventionalcommits.org/ko/v1.0.0/
# HEADER_TYPE:
${Object.keys(GIT_COMMIT_CONFIGURATION['type-enum-kor'])
.map((key) => {
return `# ${key} : ${GIT_COMMIT_CONFIGURATION['type-enum-kor'][key].description}`;
})
.join('\n')}
# REMEMBER_ME:
# HEADER TYPE은 영어로 작성해주세요.
# 한글을 지향합니다.
# 제목 끝에 마침표 금지
# 본문는 "무엇을", "왜"에 대한 내용을 작성해주세요.
`;
fs.writeFileSync('./git_commit_template', GIT_COMMIT_TEMPLATE);
packge.json에 prepare를 실행할 떄 git commit template이 돌아가도록 설정하자
{
"scripts": {
"prepare": "husky & node ./script.js & git config commit.template ./git_commit_template"
}
}
turborepo + storybook + tailwindcss + typescript
https://github.com/arevalolance/design-system-template
https://github.com/anthonyhastings/turborepo-design-system