Yarn, TypeScript 및 React Native가있는 Lerna : '@ project / common'모듈 또는 해당 유형 선언을 찾을 수 없습니다 .ts (2307)

Aug 19 2020

이 프로젝트는 Yarn, React Native, Lerna 및 Typescript를 사용합니다. 단일 저장소로 구성됩니다.

구조는 다음과 같습니다.

project
|- packages
   | - mobile
       | - src
       | - packages.json
       | - tsconfig.json
   | - cloud-functions
       | - src
       | - packages.json
       | - tsconfig.json
   | - common1
       | - lib
       | - src
       | - packages.json
       | - tsconfig.json
   | - common2
       | - lib
       | - src
       | - packages.json
       | - tsconfig.json
| - packages.json
| - tsconfig.json
| - lerna.json

lerna.json은 다음과 같습니다.

{
  "packages": [
    "packages/*"
  ],
  "npmClient": "yarn",
  "version": "0.0.7",
}

루트 packages.json은 다음과 같습니다.

{
  "name": "project",
  "private": true,
  "scripts": {
    ...
  },
  "devDependencies": {
    "@types/node": "^14.0.27",
    "lerna": "^3.22.1",
    "ts-node": "^8.10.2",
    "typescript": "^3.9.7"
  }
}

루트 tsconfig.json은 다음과 같습니다.

{
  "compilerOptions": {
    "noImplicitAny": true,
    "noUnusedLocals": true,
    "removeComments": true,
    "noLib": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "baseUrl": "./",
    "paths": {
      "@project/common1": ["packages/common1/lib"],
      "@project/common2": ["packages/common2/lib"],
      "@project/mobile": ["packages/mobile/src"],
      "@project/cloud-functions": ["packages/cloud-functions/src"],
    }
  },
  "exclude": ["node_modules", "**/*.spec.ts", "**/__tests__/*", "babel.config.js", "metro.config.js", "jest.config.js"]
}

일반적인 packages / common / packages.json은 다음과 같습니다.

{
  "name": "@project/common1",
  "version": "0.0.7",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "files": [
    "lib/**/*"
  ],
  "private": true,
  "devDependencies": {
    "@project/common2": "latest", //for common1 only
    "@types/node": "^14.0.27",
    "ts-node": "^8.10.2",
    "typescript": "^3.9.7"
  },
  "dependencies": {
    ...
  }
}

일반적인 packages / common / tsconfig.json은 다음과 같습니다.

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "lib",
    "strict": true,
    "target": "es6"
  },
  "compileOnSave": true,
  "include": ["src"]
}

React Native 파일 packages / mobile / packages.json은 다음과 같습니다.

{
    "name": "@project/mobile",
    "version": "0.0.7",
    "private": true,
    "dependencies": {
        "@project/common1": "latest",
        "@project/common2": "latest",
        ...
    },
    "devDependencies": {
        ...
        "ts-node": "^8.10.2",
        "typescript": "^3.8.3"
    },
}

나는 처음 만났다 :

lerna ERR! yarn install --mutex network:42424 --non-interactive stderr:
warning Waiting for the other yarn instance to finish (19560)
warning Waiting for the other yarn instance to finish (21568)
error An unexpected error occurred: "https://registry.yarnpkg.com/@project%2fcommon1: Not found".

분명히 Yarn은 패키지 레지스터에서 종속성을 가져 오려고합니다. 이것은 실패합니다.

그런 다음 패키지의 종속성에서 @ project / common1 및 @ project / common2에 대한 참조를 제거하려고했습니다.

소스에서 VS Code는 가져 오기에 빨간색 밑줄을 긋고 다음을 인쇄합니다.

Cannot find module '@project/common1' or its corresponding type declarations.ts(2307)

또한 Yarn Workspace를 사용하려고 시도했지만 React Native와 관련된 문제를 제기하는 모듈을 만났습니다. 유지 관리가 어려울 것 같아서 호환되지 않는 모든 패키지 목록을 만들고 싶지 않았습니다.

"workspaces": {
  "nohoist": ["react-native", "react-native/**", "@react-native-community/checkbox", "@react-navigation/native"]
}

간단한 해결책이 있습니까?

아니면이 사용 사례가 Lerna를 버리고 GitHub 기반 공용 리포지토리를 사용하는 것이 더 간단합니까?

답변

Xiiryo Aug 20 2020 at 22:32

이것이 가장 간단한 접근 방식인지는 모르겠지만 Yarn 작업 영역을 추가하여 작동시킬 수 있습니다.

기본 packages.json에서 다음을 추가했습니다.

  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "**mobile**",
      "**react**",
      "**react-native**",
      ...
    ]
  },

Lerna.json에서 다음을 추가했습니다.

  "useWorkspaces": true,

루트 tsconfig.json에서 삭제했습니다.

    "baseUrl": "./",
    "paths": {
      "@project/common1": ["packages/common1/lib"],
      "@project/common2": ["packages/common2/lib"],
      "@project/mobile": ["packages/mobile/src"],
      "@project/cloud-functions": ["packages/cloud-functions/src"],
    }