Node.js 프로젝트간에 코드를 공유하는 더 나은 방법
왜 어려운 방법으로 코드 모듈을 공유했는지 알아보십시오.
Node의 비동기 I/O 서비스가 개발하기 위한 사실상의 도구 중 하나가된 것은 누구나 알고 있습니다.
(일반적으로 REST API이지만 흔하지는 않은 다른 유형도 매우 일반적입니다).
또한 중간정도(또는 그 이상)의 프로젝트에 종사 한 적이 있는 경우는 기능을 개별 서비스로 분할하는 과정을 경험 한 적이 있을 것입니다.
이 방법은 코드가 엉키지 않게 유지하는 데 도움이됩니다.
부분 배포를 허용하고 이전 코드를 업데이트 할 때 대규모 치명적인 실패의 위험을 줄이는 것이 환상적입니다
(손상 될 수있는 양이 특정 서비스로 제한되기 때문).
즉, 위의 경험이 있다면 프로젝트 서비스간에 공유해야하는 내부 사용자 지정 라이브러리가있는 문제가있을 수 있습니다.
예를 들어, Winston에 대해 작성한 로깅 래퍼 또는 서비스간에 데이터를 보내기 위해 작성한 통신 라이브러리입니다.
어느 쪽이든 동일한 프로젝트의 모듈간에 공통 코드를 공유하려면 약간의 물류가 필요합니다.
왜냐하면 수행하지 않는 작업은 동일한 코드의 세 가지 다른 버전을 세 개의 다른 모듈 내에 병렬로 유지하는 것입니다.
이는 최악의 시나리오이며 쉽게 피할 수있는 시나리오입니다.
이 문제를 해결하는 현재 방법
누구나이 문제를 처리 할 수있는 다른 방법을 생각 해낼 수있을 것입니다.
하지만 이를 수행하는 매우 일반적인 두 가지 방법은 다음과 같습니다.
#1 NPM에서 코드 공유
물론, 시간이 지남에 공통 코드에 대해 별도의 프로젝트를 만들고 그것을 NPM에서 공유 할 수 있습니다.
보기에 이것은 좋은 아이디어이고 완벽한 솔루션처럼 들릴지도 모릅니다.
결국, NPM의 직무 기술서에 정말 적합하고있는 것은 아닐까요.
그러나 이것이 더 큰 코드베이스에서 작은 코드이라는 관점에서 갑자기 다른 사람과 공유 할 필요가있는 경우 이것이 조금 문제가있는 접근 될 수있는 몇 가지 이유가 있습니다.
자세히 설명하도록 하겠습니다.
개인 레지스트리를 사용하지 않을 수 있습니다.
결국 프로젝트의 다른 서비스를 개발하고있는 다른 동료와 사용자 지정 코드를 공유하고 있기 때문에, 당신은 전 세계의 다른 사람들이 당신의 코드를 사용하는 것을 정말로 원하지 않습니다.
또한 아실 지 모르지만, NPM을 사용하면 개인 저장소를 사용하여 사용자 지정 코드를 공개하지 않고 공개 할 수 있습니다.
설치에는 시간과 자원이 소요되므로 이것은이 경우의 해결책이 될 수 없지만, 모듈간에 공유하고자하는 사용자 정의 라이브러리가 2 개 밖에없는 경우는 비용 효과가 높지 않을 가능성이 있습니다.이전 요점이 문제가 아니더라도 공통 코드의 코드를 별도의 프로젝트로 추출한 다음 모듈을 올바르게 만들고 게시하려면 노력이 필요합니다.
모듈을 공유하는 것이 지나치게 복잡하지는 않지만 규모가 크든 작든 상관없이 일부 리팩토링이 필요하며 이를 수행 할 시간이나 인력이 없을 수 있습니다.추출한 코드는 더 이상 사용할 수 없습니다.
예,node_modules
폴더 안에 있습니다.
이 폴더는 개발자가 감히 입력하거나 볼 위치를 아는 사람이 거의없는 곳입니다.
여기서 요점은 코드베이스에서 코드를 말 그대로 제거하고 일반 외부 엔티티로 만들었다는 것입니다.
이것은 이제 자체 코드베이스를 가진 새로운 프로젝트이기 때문에 본질적으로 유지 관리를 어렵게 만듭니다.
그리고 그것은 우리가 하나의 라이브러리에 대해 이야기하고있는 경우에만, 세 개를 추출한다면 어떨까요?
아니면 4 개? 누가 그것을 유지하고 있으며 언제 업데이트를 진행합니까?
언뜻보기에는이 솔루션이 갈 길처럼 보일 수 있지만 장기적으로 계속 유지하는 것은 번거롭고 어색 할 수 있습니다.
# 2 GIT를 사용하여 다루기
GIT이 여기에서 잠재적으로 도움을 줄 수있는 두 가지 방법이 있습니다
(다른 버전 관리 시스템도 동일한 작업을 수행 할 수 있지만 이에 대해 잘 알지 못하므로 제가 아는 것을 고수하겠습니다).
범용 코드를 다른 저장소로 이동하고 기본적으로 NPM에서 한 것과 같은 일을 할 수 있지만 폴더에 서브 모듈을 포함해야합니다.
그것은 틀림 없겠 네요! 즉, 팀원 1 명 (또는 당신조차)가 일반 GIT 저장소를 사용하여 프로젝트의 저장소를 파괴하고 서브 모듈을 믹스에 추가하는 문제가 발생하지 않은 경우는 손을 들어 하십시오.
이들은 내가 얘기하는 문제를 해결하기 위해 GIT가 제공하는 우아한 솔루션이지만, 솔직히 도구 자체는 많은 개발자들이 이에 대처하기위한 복잡성을 추가 할 생각에 너무 많은 문제가 남아있다. 접근.새 저장소를 추가하는 대신 모든 것을 단일 저장소로 통합 할 수 있습니다.
결국, 요즘 모두가하고 있습니다! 따라서 서비스를 개별 저장소로 나누고 일반 모듈을 훨씬 더 많은 저장소로 나누는 대신 단일 저장소를 만들고 여기에 모든 것을 추가합니다.
설정에 따라 좋은 아이디어가 될 수도 있지만 생각해보십시오.
유지 관리해야하는 개별 미니 프로젝트는 몇 개입니까?
그리고 일반 모듈을 추가하면 몇 개입니까?
모든 것을 단일 저장소에 저장하려면 오케스트레이션이 놀랍도록 잘 실행되어야합니다. 저를 믿으세요. 예전에 해봤지만 할 수 있지만 최후의 수단으로 만 추천하겠습니다.
그럼 당분간 GIT를 그림에서 제외하겠습니다. 또는 적어도 솔루션에서 제외하고 이미 작동하고 있다면 만지지 마십시오.
Enter Bit : 구성 요소를 공유하는 새로운 방법
Bit는 프로젝트간에 구성 요소를 공유 할 수있는 새로운 서비스입니다.
언뜻보기에는 NPM과 매우 비슷합니다.
알아요.하지만 잠시만 있으면 돼요?
컴포넌트의 개념은 기본적으로 클래스 정의가있는 단일 파일, 함수 세트 또는 일반 라이브러리로 채워진 전체 폴더 등 공유하려는 모든 것입니다.
작업중인 것이 무엇이든간에 공유할 수 있다는 것을 갑자기 깨달은 경우 다른 사람에게 내보낼 수 있습니다.
그렇다면 NPM과의 차이점은 무엇입니까?
우선, 코드베이스에서 코드를 제거하는 것이 아닙니다.
갑자기 프로젝트의 나머지 부분과 분리하지 않고 공유 콘텐츠를 처리하게되므로 이것이 큰 이점이라고 생각합니다.
결국 생성했기 때문에 계속 유지 관리하지만 동시에 npm 모듈로 공유 할 수 있습니다 (곧 방법을 보여 드리겠습니다).공유하는 개별 구성 요소의 수에 관계없이 공유 코드는 코드 저장소에 남아 있습니다.
코드 버전 관리 솔루션의 일부를 공유하기 위해 추가 오케스트레이션을 추가 할 필요가 없습니다.
계속 업데이트해야하는 경우 코드를 업데이트하고 Bit의 CLI 도구가 대상 프로젝트에서 최신 버전을 가져 오도록합니다.NPM과 달리 Bit는 구성 요소의 종속성 트리를 확인합니다.
이것이 의미하는 바는 하나의 파일 만 공유하도록 선택했지만 종속성으로 다른 로컬 파일이 필요한 경우 비트가 이를 알려주고 구성 요소의 일부로 추가 할 수 있도록합니다.
기본적으로 bit는 # 1과 유사한 접근 방식으로 문제를 해결할 수 있지만 실제로 올바르게 수행하는 데 필요한 리소스를 제공합니다.
- 개인 레지스트리는 Bit에서 제공하므로 해당 부분에 대해 걱정할 필요가 없습니다.
- 게시 할 새 npm 모듈을 설정할 필요가 없습니다. 몇 단계 만 거치면 리팩토링을 수행 할 필요없이 코드를 공유 할 수 있습니다.
- 다시 말하지만, 코드가 생성 된 주 프로젝트에서 코드를 추출하지 않습니다. 동일한 위치와 동일한 저장소 내부에 남아 있습니다. 프로젝트에 미치는 영향은 거의 없습니다.
Bit를 사용하여 구성 요소 공유
그러면 코드를 어떻게 공유합니까?
여기에는 더 자세히 확인할 수있는 매우 상세한 문서 페이지가 있지만 단순성을 위해 간단한 단계를 통해 한 프로젝트에서 다른 프로젝트로 간단한 구성 요소를 공유하는 방법을 보여 드리겠습니다.
제가 공유 할 구성 요소는 로거 개체로, 단순히 Winston의 인스턴스입니다.
const winston = require("winston")
const config = require("../config.json")
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: config.logging.output_files.error, level: 'error' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
module.exports = logger
Step 1: Install bit
다양한 방법으로 비트를 설치할 수 있지만 가장 쉽고 일반적인 OS는 다음과 같이 npm을 사용하는 것입니다.
npm install bit-bin --global
Step 2: Login
일단 설치되면 로그인하거나 가입해야합니다. 특히 이미 Github 계정이있는 경우 매우 간단합니다. 명령 줄에서 다음을 입력하십시오.
bit login
이 명령은 브라우저를 시작하고 Bit의 로그인 페이지를 엽니다.
일단 로그인하고 가입 / 로그인 작업을 완료하면 공유 할 항목을 설정할 수 있습니다.
또한 로그인하면 NPM 구성 파일에 새 범위가 추가됩니다.
이제 @bit 범위에 액세스하여 기존 NPM 모듈 인 것처럼 구성 요소를 설치할 수 있습니다 (자세한 내용은 잠시 후).
Step 3: Initializing the Workspace
Bit는 작업 공간 개념을 사용하여 컬렉션 (구성 요소 그룹)을 그룹화합니다.
가장 먼저해야 할 일은 작업 공간을 초기화하는 것입니다.
다음을 입력하기 만하면됩니다.
bit init
그게 다입니다. 완료되면 무엇을 공유할지 결정할 수 있습니다.
Step 4: Adding file & Checking the status of the components
공유하려는 파일을 추가하는 것은 매우 간단합니다. 다음과 같은 프로젝트 구조를 가정합니다.
파일을 추가하려면 다음을 수행하면됩니다.
bit add lib/logger.js
그러면 파일이 추가되고 “logger”라는 새 구성 요소가 생성됩니다.
기본적으로 add 명령은 파일 이름을 사용하여 구성 요소의 이름을 지정합니다.
이 명령에 대한 전체 문서를 확인하여이 명령으로 수행 할 수있는 모든 작업을 볼 수 있습니다.
이제 필요한 모든 것이 있는지 이해하기 위해 상태 확인을 수행 할 수 있습니다.
bit status
위의 스크린 샷은 비트별로 수행 된 검사의 출력을 보여줍니다.
여기에서 CLI가 모듈에 대한 종속성 트리를 만들고 확인합니다.
이전 코드를 보면 아직 추가하지 않은 JSON 파일이 필요하다는 것을 알 수 있습니다.
이것은 npm 경로를 사용하는 대신 비트를 사용하는 이점 중 하나이며 중요한 파일을 놓치는 것을 방지 할 수 있습니다.
다른 파일을 추가 한 후 새 상태 확인을 수행하면 더보기 좋은 응답을받을 수 있습니다.
Step 5: Versioning
파일을 업로드하기 전에 구성 요소 버전에 태그를 지정해야합니다.
이렇게하면 모든 구성 요소에 태그가 지정되므로 모두 동시에 초기화하는 것이 좋습니다.
bit tag --all 0.0.1 --message "initial version for the component"
이 단계는 필수이며 첫 번째 버전에 태그를 지정할 때까지 아무것도 커밋 할 수 없습니다.
Step 6: Exporting the component (구성 요소 내보내기)
위의 모든 것이 준비되면 구성 요소를 내보내려면 해당 구성 요소가있을 컬렉션을 만들어야합니다.
웹 사이트에서이 작업을 수행하고 만든 후에는 다음을 수행 할 수 있습니다.
bit export <account-name>.<collection-name>
제 경우에는 컬렉션을 “custom-logger”라고 부르고 내 계정 이름은 “deleteman”이므로 명령은 다음과 같습니다.
bit export deleteman.custom-logger
그러면 코드나 리포지토리에 아무 작업도 수행하지 않고 파일을 사용자 정의 레지스트리에 업로드합니다.
7 단계 : 다른 곳에서 사용 (선택 사항)
다른 프로젝트에서 구성 요소를 사용해야하는데 그렇지 않으면 필요하다고 생각하는 경우 여기에서 뭘하는 거죠?
다음과 같이 작성하여 NPM을 사용하여 설치할 수 있습니다.
npm install @bit/<account-name>.<collection-name>.<component-name>
따라서 우리의 경우 :
npm install @bit/deleteman.custom-logger.logger
구성 요소 중 하나를 참조하고 있지만 모든 종속성도 설치되므로 이를 사용하려면 다음과 같이 필요합니다.
const logger = require("@bit/deleteman.custom-logger.logger")
logger.info("Testing test!")
물론 나중에 npm install
명령을 실행하는 상자는 2 단계에서 보여준 것처럼 먼저 비트에 로그인해야합니다
(npm에 대한 비트 범위 설정을하고 액세스 권한을 갖기 위해 개인용 일 수도 있으므로 구성 요소에 추가).
결론
이 간단한 단계를 통해 프로젝트에서 코드를 꺼내지 않고도 공유하고 최소한의 노력으로 다른 코드에서 사용할 수있었습니다.
이 기사는 이미 꽤 길기 때문에 GIT와 Bit 간의 상호 작용이 어떻게 진행되는지, 구성 요소의 내용과 해당 버전을 업데이트하는 방법 및 모든 요소로 번역 할 수있는 방법을 보여주는 등 선택적 단계를 생략하기로 결정했습니다.
관련 프로젝트. 이러한 기본 단계 뒤에는 훨씬 더 많은 것이 있지만, 이러한 서비스를 사용하여 최소한의 노력으로 관련 프로젝트간에 공통 코드를 공유 할 때의 이점을 보여주기에 충분합니다.
이전에 Bit를 사용해 본 적이 있거나 다른 접근 방식으로 이 문제를 해결할 수 있었다면 아래에 댓글을 남겨주세요.
이에 대해 읽고 싶습니다!