본문 바로가기

프로그램언어/Javascript

npm dependency 고정하기

반응형

솔라나 오픈소스를 이용하여 개발하던 중 발생하지 않았던 에러가 발생했다.

src/solana-nft/commands/mint-nftV2.ts:26:3 - error TS2305: Module '"@solana/web3.js"' has no exported member 'TransactionCtorFields'.

내가 참고하고자 하는 "@metaplex-foundation/mpl-token-metadata": "^2.1.1" 소스코드에서는 TransactionCtorFields 객체를 사용하고 있으며, 해당 npm 프로젝트 (fixed-price-sale) 에서는 "@solana/web3.js": "^1.37.0" 를 dependency 로 가지고 있었다.


나도 그래서 "@solana/web3.js": "^1.37.0" 이 설정을 package.json 에 담고 있었는데, npm list 으로 프로젝트가 사용하는 패키지들을 살펴보니 "@solana/web3.js": "^1.42.0" 를 사용하고 있었다.

 npm list
solana_middleware@0.0.1 /home/gus/solana_middleware
├── @metaplex-foundation/mpl-token-metadata@2.1.1
├── @nestjs/cli@8.2.5
├── @nestjs/common@8.4.4
├── @nestjs/core@8.4.4
├── @nestjs/platform-express@8.4.4
├── @nestjs/schematics@8.0.10
├── @nestjs/testing@8.4.4
├── @project-serum/anchor@0.24.2
├── @solana/spl-token@0.2.0
├── @solana/web3.js@1.42.0
├── @types/dotenv@8.2.0
├── @types/express@4.17.13
├── @types/jest@27.4.1
├── @types/node@16.11.31
├── @types/supertest@2.0.12
├── @typescript-eslint/eslint-plugin@5.21.0
├── @typescript-eslint/parser@5.21.0
├── class-transformer@0.5.1
├── class-validator@0.13.2
├── dotenv@16.0.0
├── eslint-config-prettier@8.5.0
├── eslint-plugin-prettier@4.0.0
├── eslint@8.14.0
├── jest@27.5.1
├── loglevel@1.8.0
├── node-fetch@2.6.7
├── prettier@2.6.2
├── reflect-metadata@0.1.13
├── rimraf@3.0.2
├── rxjs@7.5.5
├── source-map-support@0.5.21
├── supertest@6.2.3
├── ts-jest@27.1.4
├── ts-loader@9.2.9
├── ts-node@10.7.0
├── tsconfig-paths@3.14.1
├── tweetnacl@1.0.3
└── typescript@4.6.3

"@solana/web3.js": "^1.42.0" 에서는 참고로 TransacionCtorFields_DEPRECATED 로 객체명을 바꾸어놓았다. mpl-token-metadata 프로젝트를 참고하는 입장에서 최신 web3 패키지를 사용할 수가 없었다.

명시한 버젼 보다 최신 버젼을 받아오고 있었던 이유는 ^ 태크 때문이다. "@solana/web3.js": "1.37.0" 으로 수정하여 내가 원하는 버젼을 사용할 수 있었다.

번외 dependency override 1

서칭을 하던 중 특정 패키지의 dependency 에서 사용하는 nested dependency 를 강제로 바꿔주는 방법도 있었다. npm cli v8.3.0 (2021-12-09) 이후 버젼부터 package.json 에서 다음과 같이 사용하면 된다.

For example, the project has typescript version 4.6.2 as direct development dependency and awesome-typescript-loader that uses old version 2.7 of typescript. Here is how you can tell npm to use version 4.6.2 of typescript for awesome-typescript-loader:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "typescript": "~4.6.2",
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "$typescript"
    }
  }
}
If you don't use typescript as direct development dependency, then you have to write 4.6.2 instead of $typescript in overrides section:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "~4.6.2"
    }
  }
}
Same overrides can be used for both dependencies and devDependencies.

번외 dependency override 2

또한 특정 nested dependency 가 아닌 특정 dependency 를 강제로 수정할 수도 있다.

{
  "overrides": {
    "node-ipc@>9.2.1 <10": "9.2.1",
    "node-ipc@>10.1.0": "10.1.0"
  }
}
반응형

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

Infura ipfs (get) vs (cat)  (0) 2022.06.07
nestjs dotenv 설정  (0) 2022.05.19
node_modules 로컬 파일 바라보기  (0) 2022.05.16
async 함수 throw catch  (0) 2022.05.10
npm init - permission denied 해결  (0) 2022.03.30