인간은 많은 시간과 노력을 들이지 않고는 문제의 큰 그림을 보기가 어렵습니다. 특히 크고 복잡한 애플리케이션으로 작업할 때 이런 일이 자주 발생합니다. 내 변경 사항의 부작용은 무엇인가요? 여기 이 줄이 코드베이스의 원격 부분의 테스트에 영향을 미치는 이유는 무엇인가요? 완벽하거나 완전한 솔루션은 존재하지 않지만, Shopify에서 여러분과 여러분의 팀에 도움이 될 수 있는 도구를 출시했습니다.
소개
다음에 대해 이야기하기 위해 Packwerk를 사용하려면 먼저 몇 가지 개념을 소개해야 합니다.
- 응집력는 모듈 또는 클래스의 요소가 얼마나 많이 함께 속해 있는지를 나타내는 척도입니다.
- 커플링는 모듈 또는 클래스 간의 종속성 수준을 나타냅니다.
- 경계사이의 장벽을 나타냅니다. 코드. 이 경우 코드 경계는 동일한 코드베이스 내에서 서로 다른 관심 도메인을 의미합니다.
- 모듈화소프트웨어 시스템을 여러 개의 개별 모듈로 나누어 각 모듈이 독립적으로 작동하도록 하는 프로세스입니다.
문제
아시다시피 Ruby 는 코드 경계를 적용하는 데 좋은 솔루션을 제공하지 않습니다. 가시성을 지정할 수는 있지만 모든 종속성이 전역 네임스페이스에 로드됩니다. 대규모 또는 모놀리스 애플리케이션에서 이러한 경계가 없으면 다음과 같은 문제가 발생합니다.
Shopify의 모놀리스를 모듈화하고 경계를 강화하기 위해 다양한 솔루션을 시도했지만 기대했던 결과를 얻지 못했습니다:
- 비공개 상수 설정하기,
- 보석을 통해 경계를 설정합니다,
- 테스트를 사용하여 교차 컴포넌트 연결을 방지합니다,
- 루비의 변조 보석 사용,
- 마이크로서비스 만들기.
이전 시도에서 얻은 모든 지식을 바탕으로 자체 도구를 만들기로 결정했습니다: Packwerk.
Packwerk
Packwerk란 무엇인가요?
Packwerk 그룹 간의 경계를 설정하는 데 사용되는 정적 분석 도구입니다. Ruby 파일에 패키지.
패키지란 무엇인가요?
A 패키지 는 자동 로드된 코드가 포함된 폴더입니다. Shopify의 팀 는 패키지를 만들 때 모범 디자인 사례를 사용하도록 권장합니다.
- 기능성이 높은 것들을 함께 포장해야 합니다. 응집력,
- 패키지는 서로 비교적 느슨하게 결합되어 있어야 합니다.
경계 검사 유형
개인정보 보호 및 종속성 경계를 적용하고, 경계 위반 및 주기적 종속성을 확인할 수 있습니다.
실무에 적용하는 팩워크
패키지를 만들 때 애플리케이션을 구조화하거나 재구조화할 수 있는 특정한 방법은 없습니다. 이 문서에서는 다음에서 제안하는 접근 방식을 따르겠습니다.
스테판 하게만 Ruby on Rails의 점진적 모듈화.
프로젝트 선택
새 프로젝트 를 클릭하거나 프로젝트 중 하나를 선택하세요. 저는 다음과 같은 오픈 소스 프로젝트를 사용하기로 결정했습니다. 코드트리지. Rails 6 애플리케이션이 필요하다는 점을 언급하는 것이 중요합니다. Packwerk Zeitwerk를 사용합니다.
Packwerk 초기화
먼저 젬파일에 다음과 같이 젬을 추가해야 합니다. 보석 '팩워크'
를 클릭한 다음 번들
을 클릭합니다. 그런 다음 실행 중인 젬을 초기화할 준비가 되었습니다. 팩워크 초기화
.
그 후, 우리는 다음과 같은 사실을 알게 되었습니다. Packwerk 세 개의 파일을 생성했습니다:
-
packwerk.yml
-
package.yml
-
inflections.yml
packwerk.yml 의 구성 파일입니다. Packwerk 여기서 포함 및 제외 파일을 정의하고, 로드 경로를 나열하고, 굴절 파일을 정의하는 등의 작업을 수행합니다;
package.yml 는 패키지의 구성 파일입니다. 이 파일에서 패키지의 경계에 대한 구성을 추가합니다. package.yml이 있는 모든 폴더는 다음에서 패키지로 인식됩니다. Packwerk. 그게 다입니다, Packwerk 첫 번째
패키지라고 부르며 root 패키지입니다.
inflections.yml 는 사용자 정의 굴절과 약어를 사용할 경우 이를 배치하는 곳입니다.
파일 및 파일 구성에 대한 자세한 내용은 다음에서 확인할 수 있습니다.
Packwerk.
Packwerk 속성
모듈화가 작동하려면 세 가지 기본 속성이 필요합니다: 명명된 컨테이너, 그 콘텐츠및 명시적 종속성 다른 컨테이너. 따라서 이러한 속성을 Packwerk:
-
이름: 패키지의 이름은 루트에서 상대 경로입니다.
애플리케이션입니다.
-
콘텐츠: package.yml을 폴더에 넣으면 이제 폴더의 모든 파일이 패키지의 콘텐츠가 됩니다.
-
종속성: 다른 패키지에 대한 종속성 키를 추가하여 종속성을 정의할 수 있습니다. package.yml.
기본적으로 포함되지는 않지만 권장되는 또 다른 파일은 README입니다. 패키지 사용법에 대한 정보를 제공하는 것이 중요합니다.
에피소드 1의 끝

자세히 보기
GraphQL Ruby. 성능은 어떨까요?
철도 및 기타 운송 수단
TMUX, Vim, Fzf + Ripgrep을 사용한 레일 개발