본문 바로가기

프로그램언어/Javascript

node_modules 로컬 파일 바라보기

반응형

노드js 오픈소스로 개발을 하다보면 dependency 로 받아온 패키지로부터 에러 로그가 발생하곤 한다.


필자는 솔라나 민팅 프로그램을 만들면서 "@metaplex-foundation/mpl-token-metadata": "^2.1.1" 패키지를 사용하는데, 이 패키지의 dependency 로 "@metaplex-foundation/beet-solana": "^0.1.1" 패키지를 받아온다.


그리고 아래와 같은 에러가 발생했다.

[Nest] 20081  - 05/16/2022, 2:14:10 PM   ERROR [ExceptionsHandler] value.toBytes is not a function
TypeError: value.toBytes is not a function
    at Object.write (/home/gus/beet--metaplex-foundation-beet-solana-0.1.1/beet-solana/src/keys.ts:50:23)
    at BeetWriter.write (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/read-write.ts:39:10)
    at BeetWriter.writeStruct (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/read-write.ts:46:12)
    at BeetArgsStruct.serialize (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/struct.ts:103:12)
    at BeetArgsStruct.write (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/struct.ts:63:42)
    at Object.write (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/beets/collections.ts:103:17)
    at Object.write (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/beets/composites.ts:98:13)
    at BeetWriter.write (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/read-write.ts:39:10)
    at BeetWriter.writeStruct (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/read-write.ts:46:12)
    at BeetStruct.serialize (/home/gus/solana_middleware/node_modules/@metaplex-foundation/beet/src/struct.ts:103:12)

정확한 해결을 위해 애러가 발생한 value 에 어떤 값이 전달되었는지 콘솔을 찍어보려고 했으나 node_modules 에는 소스코드 대신dist 디렉토리에 배포를 위해 빌드된 소스만 존재했다.

(symbolic link) 기능을 이용하면 node_module 중 특정 패키지를 로컬에서 빌드한 소스코드를 바라보게할 수 있다.

  1. 수정하고자 하는 패키지를 로컬로 받아온다.
  2. 소스코드를 수정한다.
  3. 수정한 패키지를 빌드한다: yarn build
  4. 수정한 패키지에 대한 링크를 생성한다: yarn link
  5. 이를 사용하고자 하는 프로젝트에서 링크를 사용하도록 설정한다: yarn link "@metaplex-foundation/beet-solana

yarn 에서는 로컬에서 관리하는 node 패키지에 대해 글로벌한 symbolic link 를 관리한다. 따라서 프로젝트 디렉토리 위치에 관계없이 위와 같은 yarn link 기능을 활용할 수 있다.

필자의 예시

  1. dependency 에 명시된 패키지와 동일한 버젼 "@metaplex-foundation/beet-solana": "^0.1.1"Github에서 다운받았다.
  2. 애러가 발생한 keys.ts 파일의 함수에서 전달된 값 value 에 대해 콘솔 로그를 찍어보았다.
  write: function (buf: Buffer, offset: number, value: PublicKey): void {
    console.log(value);
    console.log(typeof value);
    const arr = value.toBytes()
  1. 링크를 생성하고 사용한다.

yarn link
yarn link "@metaplex-foundation/beet-solana"

  1. 애러가 발생한 함수 value.toBytes() 에서 value 는 web3.PublicKey 타입을 기대했지만 필자는 string 을 전달했기 때문에 함수가 존재하지 않는 애러가 발생했다.
8c1wDYsAynw1ZQjTqkt35qPxHaq5fFwmVdtpmujws8D3
string
  1. 원인을 알았으니 수정하여 해결했다. 😀

(번외) 오픈소스 프로젝트에 기여하기 위해서는 branch 기능을 사용하라.

필자처럼 애러를 고치기 위해서라면 branch 활성화 없이 패키지를 수정해도 되지만, 오픈소스 프로젝트의 버그를 수정하고자 한다면

  1. 소스코드를 fork 하여
  2. 수정을 위한 branch 를 생성하고
  3. 버그를 수정하고
  4. 해당 브랜치에 대한 pull request 를 보내면

된다.

오픈소스 코딩에 도움이 됐기를 바란다. 😉

출처: https://whatapalaver.co.uk/npm-dependency

반응형

'프로그램언어 > Javascript' 카테고리의 다른 글

nestjs dotenv 설정  (0) 2022.05.19
npm dependency 고정하기  (0) 2022.05.18
async 함수 throw catch  (0) 2022.05.10
npm init - permission denied 해결  (0) 2022.03.30
hex String 형변환  (0) 2022.03.24