-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FE] client, designsystem 간 모노레포 의존성 설정 #532
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생많았어요~~ 덕분에 아주 편하게 행동디자인을 사용할 것 같아요
변경사항 470개 보고 좀 놀라긴했는데, 서버를 지워서 저렇게 된 것보고 안심했습니다ㅋㅋㅋㅋ
{ | ||
"nodes": {}, | ||
"externalNodes": {}, | ||
"dependencies": {}, | ||
"version": "6.0" | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pr에 lerna를 사용한다고 되어있는데 nx가 있는 것은 실수로 남겨둔 것인가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아뇽~ lerna 자체가 nx 기반으로 만들어진 거고, lerna graph를 위한 project-graph.json 파일이에요~!~!
"cypress-open": "cypress open", | ||
"cypress-run": "cypress run", | ||
"test": "jest" | ||
"start": "npx lerna run build:watch --scope=haengdong-design --parallel & npx lerna run dev --scope=haengdong-client --parallel", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
진짜 갓갓이다.. 행동디자인을 바꿔도 바로 client에 적용할 수 있는 방법이 있다니
"commit-version": "git add . && git commit -m \"chore(release): v`node -p 'require(\"./lerna.json\").version'`\"", | ||
"release": "npx lerna publish from-package", | ||
"ci:release": "npx lerna publish from-package --yes", | ||
"graph": "npx nx graph" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
graph 명령어는 어떤건가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"@sentry/react": "^8.25.0", | ||
"@tanstack/react-query": "^5.51.23", | ||
"haengdong-design": "*", | ||
"jest-canvas-mock": "^2.5.2", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사소하긴한데 이 의존성은 개발과 관련된 것 같아서 옮겨도 좋을 것 같아요.
@@ -11,6 +11,7 @@ | |||
"scripts": { | |||
"start": "webpack serve ", | |||
"build": "rm -rf dist && mkdir dist && tsc && cp -r ./src/assets ./dist && tsc-alias", | |||
"build:watch": "tsc --watch & tsc-alias --watch", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
행동 디자인을 수정 후 build:watch 명렁어로 빌드를 해준 후에 사용하면 되는 것일까요?
근데 영상보면 수정하자마자 바로 반영이 되는 것 같은데;;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기 있는 build:watch
명령어는 client 디렉토리에서 npm run start 명령어를 위해서 사용되는거에요
npm run start를 하면, haengdong-client 에서는 npm run dev, haengdong-design에서는 build:watch가 동시에 실행되는데, 여기서 변경사항이 생기면 다시 빌드되면서 npm run dev에 반영이 되는 방식입니다.
모노레포 적용 재 논의가 필요하여 close 합니다 |
참고사항
workflow 내용을 담은 PR을 main을 향하도록 따로 만들도록 하겠습니다~
issue
구현 목적
생산성 관리 툴
Yarn Workspace
장점
• 간편한 설정: Yarn Workspaces는 설정이 간단하며, 별도의 복잡한 설정 없이 모노레포에서 여러 패키지를 관리할 수 있습니다.
• 의존성 관리: 모든 패키지의 의존성을 루트에서 한 번에 설치하고, 중복된 패키지를 공유하여 디스크 공간을 절약하고 설치 속도를 향상시킬 수 있습니다.
• 디스크 공간 절약: 중복되는 패키지를 루트에서 공유하여 설치하므로, 전체 프로젝트의 디스크 사용량이 줄어듭니다.
• 빠른 설치: 패키지를 한 번에 설치하기 때문에 설치 속도가 빠르며, 의존성 문제를 최소화할 수 있습니다.
단점
• 제한된 기능: Yarn Workspaces는 기본적인 모노레포 기능만 제공하므로, 복잡한 빌드 시스템이나 작업 그래프 분석, 빌드 캐시 등 고급 기능이 부족합니다.
• 추가 도구 필요: 고급 기능이나 대규모 프로젝트에서 필요한 기능을 위해서는 Lerna나 Nx 같은 추가 도구와 함께 사용해야 할 수 있습니다.
• 독립적인 버전 관리 부재: Yarn Workspaces 자체로는 패키지의 버전을 독립적으로 관리할 수 있는 기능이 없습니다. Lerna와 함께 사용하여 이러한 기능을 추가해야 합니다.
Nx
장점
• 빌드 캐시 및 작업 그래프: Nx는 작업 간의 의존성을 분석하고 빌드, 테스트, 린트 작업의 결과를 캐시하여 빌드 시간을 크게 단축할 수 있습니다.
• 다양한 플러그인 지원: Nx는 React, Angular, NestJS 등 다양한 프레임워크와의 통합을 위한 플러그인을 제공하여, 빠르고 일관된 개발 환경 설정을 가능하게 합니다.
• 대규모 프로젝트에 최적화: Nx는 대규모 모노레포에서 발생하는 복잡한 워크플로우를 관리하는 데 최적화되어 있습니다. 특히 여러 팀이 협력하는 환경에서 유용합니다.
• 유지 관리 도구: Nx는 코드 스캐폴딩, 린팅, 테스트 설정 등 프로젝트 유지 관리를 위한 강력한 도구를 제공합니다.
단점
• 복잡도: Nx는 매우 강력한 도구이지만, 그만큼 설정과 사용법이 복잡할 수 있습니다. 작은 프로젝트에서는 필요 이상으로 복잡하게 느껴질 수 있습니다.
• 학습 곡선: Nx의 다양한 기능과 설정을 이해하고 사용하는 데 시간이 걸릴 수 있습니다. 특히 처음 사용하는 개발자에게는 다소 어렵게 느껴질 수 있습니다.
• 비교적 새로운 도구: Lerna와 비교했을 때, Nx는 상대적으로 새로운 도구이기 때문에 일부 개발자나 팀에서 경험이 부족할 수 있습니다.
Lerna
장점
• 독립적인 버전 관리: 각 패키지의 버전을 독립적으로 관리할 수 있어, 특정 패키지만 업데이트할 수 있습니다.
• 퍼블리시 기능: 여러 패키지를 한 번에 퍼블리시하거나 선택적으로 퍼블리시하는 기능이 강력합니다.
• NPM/Yarn과의 호환성: Lerna는 기존의 NPM 또는 Yarn 기반 프로젝트와 쉽게 통합할 수 있습니다. 기존 프로젝트에 모노레포 관리 기능을 추가하기에 적합합니다.
• 유연성: Lerna는 다양한 워크플로우와 설정에 대해 유연하게 작동할 수 있으며, 특정 사용 사례에 맞게 커스터마이징할 수 있습니다.
단점
• 빌드 성능: Lerna 자체는 빌드 성능 최적화에 대한 기능이 부족합니다. 빌드 캐시나 작업 그래프 분석과 같은 기능이 없어 대규모 프로젝트에서는 빌드 시간이 길어질 수 있습니다.
• 확장성 한계: 아주 큰 규모의 모노레포에서는 Lerna의 기본적인 기능만으로는 관리가 어려울 수 있으며, 추가적인 도구와의 통합이 필요할 수 있습니다.
결론
구현 사항
1. 모노레포 환경을 위한 폴더 구조 변경
기존에는 위와 같이 server, client, HDesign이 모두 최상단에 존재했습니다.
lerna를 이용하여
haengdong-client
와haengdong-design
을 한번에 관리하기 위해, client 내부packages
폴더로 두가지 폴더를 이동했습니다. 또한, 혼동 방지를 위하여 패키지 이름도 명확하게 변경하였습니다.2.
haengdong-design
의존성 주입을 통해 client에서 변경 감지2024-08-30.5.58.02.mov
작동 방식은 아래와 같습니다.
haengdong-design
의 의존성을"*"
로 표시하여 같은 모노레포 내부의 패키지를 가르키게 변경했습니다.lerna의 scrpit에서
haengdong-design
의 build:wiatch 스크립트를 실행시키고,haengdong-client
의 dev 스크립트를 실행시킵니다.build:watch
스크립트는haengdong-design
스크립트에서는 빌드에 사용되는tsc
,tsc-alias
를--watch
접미사를 통해 변경을 감지하여 재 빌드되도록 합니다.이 과정을 거치면
haengdong-client
의 개발서버에서 배포된haengdong-design
npm 을 가르키는 것이 아니라, 내부 package의haengdong-design
을 가르키며,build:watch
스크립트를 통해 디자인시스템의 변경이 생길때 마다 내부 package가 재 빌드되기 때문에, 바로 반영된 것을 확인할 수 있습니다.3. lerna를 통한 패키지 통합 테스트 및 CI 수정
client/package.json
의 스크립트는 아래와 같습니다.npx lerna run ~~
명령어를 실행시키면packages
내부의 모든 패키지에서npm run ~~
을 실행시킵니다.npx lerna run lint
를 예로 들면 client에서도, design에서도 모두npm run lint
를 실행시킵니다.--scope=package-name
을 사용하면 범위를 지정할 수 있습니다.lerna를 이용하여
/client
경로에서도 내부의haengdong-client
,haengdong-design
의 테스트 및 빌드를 한번에 진행할 수 있습니다.따라서, workflow도
client
와design
모두 일괄적으로 테스트 할 수 있도록 변경하였습니다.4. lerna를 이용한 디자인시스템 릴리즈 PR 생성 CI
fe-dev branch에 버전을 신경쓰지 않고 계속 merge한 뒤 main 브랜치로 release할 때, 해당 workflow를 실행하면 release에 대한 pr이 생성됩니다.
이는 main에 merge되어야 적용되므로 별도로 main으로 향하는 PR을 만들겠습니다.
위 workflow를 이용해 release PR을 만들었습니다. 해당 PR을 확인하고, main에 merge하게 된다면 아래와 같은 workflow가 작동합니다.