Estoy tratando de configurar un monorepo con 3 servicios que comparten algún código de biblioteca.
Esta es la situación actual:
repo: web pdf/ package.json reference to shared-ts using github url tsconfig.json frontend/ package.json reference to shared-ts using github url tsconfig.json repo: mobile (react-native) package.json reference to shared-ts using github url tsconfig.json repo: shared-ts package.json tsconfig.json Esto funciona, pero es una molestia comprometerse con shared-ts , compilar, cambiar el hash en package.json y confirmar nuevamente.
Esto es lo que me gustaría lograr:
repo: monorepo pdf/ package.json reference to ../shared-ts tsconfig.json frontend/ package.json reference to ../shared-ts tsconfig.json mobile/ package.json reference to ../shared-ts tsconfig.json shared-ts/ package.json tsconfig.jsonHasta ahora he probado:
"shared-ts": "../shared-ts" en package.json pero copia shared-ts en node_modules de cada paquete, así que tengo que volver a ejecutar yarn cada vez que hago un cambioyarn link en postinstall : error TS2307: Cannot find module 'shared-ts' or its corresponding type declarations.postinstall con ln -s ../shared-ts/ node_modules/shared-ts/ pero parece que TypeScript no encuentra el módulonpm link en postinstall parece ser el más prometedor, pero es muy lento y tengo problemas para ejecutarlo en CI debido a algunos problemas de permisos.¿Hay una buena manera de hacer esto? ¿Alguna idea sobre otras cosas que podría probar?
usando yarn workspace & lerna
aquí hay un ejemplo de plantilla monorepo
He hecho las cosas que te interesan en un proyecto reciente. Los resultados deseados se pueden lograr con monorepo utilizando lerna y el espacio de trabajo de hilo. Para más detalles, por favor vaya a este enlace
Con lo anterior, estaremos creando un paquete de tipos. En otros paquetes, solo importaremos tipos de paquetes como los siguientes:
import { Post } from "@types";Las cosas son mucho más fáciles de esta manera que vincular paquetes nosotros mismos.
puedes usar el espacio de trabajo y Lerna
yarn workspace & lerna ├── README.md ├── lerna.json ├── package.json ├── packages │ ├── pdf │ │ ├── package.json /* "shared-ts": "^1.0.0" */ │ │ └── src │ ├── frontend │ │ ├── package.json │ │ └── src │ ├── mobile │ │ ├── package.json │ │ └── src │ ├── shared-ts │ │ ├── package.json │ │ └── src ├── tsconfig.json └── yarn.lockaquí hay un repositorio de ejemplo
aquí puede ver que x-cli se está compartiendo x-core
puede usar el paquete mtsl que nos permite crear enlaces simbólicos tangibles. puede instalar este paquete globalmente
npm install -g mtslentonces solo necesita comenzar a separar estos tres comandos en la terminal.
mtsl startwithoutadd -s path_of_project/packages/shared-ts -d path_of_project/packages/pdf/node_modules/shared-ts mtsl startwithoutadd -s path_of_project/packages/shared-ts -d path_of_project/packages/frontend/node_modules/shared-ts mtsl startwithoutadd -s path_of_project/packages/shared-ts -d path_of_project/packages/mobile/node_modules/shared-ts Tenga en cuenta que no detenga a este observador de tres. después de la prueba, puede hacer un solo comando desde el script package.json
Su caso de uso se puede manejar utilizando los espacios de trabajo de npm7 . En resumen, su nueva estructura monorepo debería verse a continuación:
repo: monorepo package.json // <- here you define the workspaces pdf/ package.json reference to shared-ts tsconfig.json frontend/ package.json reference to shared-ts tsconfig.json mobile/ package.json reference to shared-ts tsconfig.json shared-ts/ package.json tsconfig.json Debe enumerar los espacios de trabajo en el package.json , que podría verse como a continuación:
{ "name": "awesome-monorepo", "workspaces": [ "pdf", "frontend", "mobile", "shared-ts" ] } Después de hacer eso, en cualquier lugar del monorepo en el que decida usar shared-ts , puede agregarlo a dependencies o devDependencies simplemente haciendo referencia al número de versión en lugar de la ruta relativa.
Todos los módulos de nodo, incluidos los espacios de trabajo, se elevan a la raíz node_modules , por lo que la resolución del módulo debería funcionar sin fricción.
Puede usar NX para mantener sus repositorios, en los que sus repositorios web y mobile serán sus aplicaciones, y los shared-ts serán una librería de modo que la web y el mobile dependan de shared-ts .
Tiene un paquete.json común o un paquete.json separado para cada repositorio individualmente. NX proporciona dependencyGraph y las funciones affected , en las que si cambia las bibliotecas comunes, determina qué módulos/aplicaciones compilar sin tener que compilar todo.
Su estructura de código se vería así:
apps: web: src package.json mobile: src package.json libs: shared-ts: src package.json workspace.jsonProbablemente sea mejor buscar los documentos oficiales para obtener la mejor configuración y opciones, pero creo que proporciona lo que está buscando.