İplik, TypeScript ve React Native ile Lerna: '@ project / common' modülü veya karşılık gelen tür bildirimleri bulunamıyor. T (2307)
Proje Yarn, React Native, Lerna ve Typescript kullanıyor. Monorepo olarak yapılandırılmıştır
Yapı şu şekildedir:
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 şuna benzer:
{
"packages": [
"packages/*"
],
"npmClient": "yarn",
"version": "0.0.7",
}
Root packages.json şuna benzer:
{
"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 kökü şuna benzer:
{
"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"]
}
Tipik packages / common / packages.json şuna benzer:
{
"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": {
...
}
}
Tipik paketler / common / tsconfig.json şuna benzer:
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "lib",
"strict": true,
"target": "es6"
},
"compileOnSave": true,
"include": ["src"]
}
React Native dosya paketleri / mobile / packages.json şuna benzer:
{
"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"
},
}
İlk önce karşılaştım:
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".
Açıkçası Yarn, bağımlılıkları paket kayıtlarından almaya çalışıyor. Bu başarısız olur.
Daha sonra paketlerin bağımlılıklarında @ project / common1 ve @ project / common2 referanslarını kaldırmaya çalıştım.
Kaynakta VS Code, içe aktarımların altını kırmızıyla çizer ve şunu yazdırır:
Cannot find module '@project/common1' or its corresponding type declarations.ts(2307)
Ayrıca Yarn Workspace'i kullanmayı denedim, ancak React Native ile modülleri kaldırma sorunlarıyla karşılaştım. Bakımı zor göründüğü için, muhtemelen tüm uyumsuz paketlerin bir listesini oluşturmak istemedim.
"workspaces": {
"nohoist": ["react-native", "react-native/**", "@react-native-community/checkbox", "@react-navigation/native"]
}
Basit bir çözüm var mı?
Yoksa bu kullanım senaryosu için Lerna'yı terk etmek ve GitHub tabanlı ortak depoları kullanmak daha mı basit?
Yanıtlar
Bu en basit yaklaşım mı bilmiyorum ama Yarn çalışma alanları ekleyerek onu çalıştırabilirim.
Main packages.json 'da ekledim:
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**mobile**",
"**react**",
"**react-native**",
...
]
},
Lerna.json'da şunu ekledim:
"useWorkspaces": true,
Tsconfig.json kökten sildim:
"baseUrl": "./",
"paths": {
"@project/common1": ["packages/common1/lib"],
"@project/common2": ["packages/common2/lib"],
"@project/mobile": ["packages/mobile/src"],
"@project/cloud-functions": ["packages/cloud-functions/src"],
}