Tengo un proyecto angular estructurado así:
Sitio1
Sitio2
Sé que esto no es lo ideal, pero es así.
Los archivos package.json son exactamente iguales, aparte de los nombres de la aplicación.
El proyecto se inició en Angular 8 y siempre se ha actualizado bien, pero al pasar de 11 -> 12 tengo problemas:
Site1 se construye bien y funciona bien. Site2 se construye bien, pero los errores se ejecutan inmediatamente con
Error: inject() debe llamarse desde un contexto de inyección en injectInjectorOnly (core:4745) en Module.ɵɵinject (core:4755) en Object.RouterModule_Factory [as factory] (router:5999) en R3Injector.hydrate (core.js: 11438) en R3Injector.get (core.js:11257) en core.js:11295 en Set.forEach () en R3Injector._resolveInjectorDefTypes (core.js:11295) en el nuevo NgModuleRef$1 (core.js:25325) en NgModuleFactory$1 .create (core.js:25379)
Como Site1 funciona bien, supongo que debe ser algo al llamar a SharedModule.
Intenté agregar "preserveSymlinks": true, a projects.$name.architect.build.options, pero eso no funciona. No estoy usando npm link ya que el otro módulo no es una biblioteca (sé que debería haberse configurado de esa manera, pero no lo es).
Pasé al menos 2 días tratando de hacer que esto funcione (obviamente revisando publicaciones como esta y esta , pero las respuestas no parecen funcionar).
¿Alguien sabe cómo solucionar esto, o al menos cómo depurarlo, por favor?
Para el beneficio de los buscadores, después de no obtener una respuesta aquí, le pregunté esto a Angular.
Aquí están las respuestas proporcionadas.
Tiene dos árboles de espacio de trabajo distintos que se importan entre sí. Eso seguramente sufrirá versiones duplicadas de @angular/core que confunden el tiempo de ejecución, lo que resulta en el error de tiempo de ejecución bastante oscuro que está viendo. Puede solucionar esto utilizando asignaciones de rutas, como se explica en la guía de la biblioteca aquí (que también se aplica a su situación sin bibliotecas). No estoy seguro de por qué funcionó en versiones anteriores, siempre ha sido propenso a este tipo de problemas.
y
La causa es que los dos espacios de trabajo separados tienen sus propios paquetes @angular/core y ambos terminan en la aplicación incluida. El tiempo de ejecución de Angular mantiene su estado en las variables de módulo de nivel superior que son privadas para ese módulo, pero al tener dos ocurrencias de ese módulo (de ambas instancias de @angular/core), se encuentra con situaciones en las que el estado solo se inicializa correctamente en una instancia, no el otro En este caso, el contexto de inyección solo está disponible en el tiempo de ejecución "primario", pero las partes de la aplicación que se agruparon desde las partes de la biblioteca "secundarias" dependerán del estado del tiempo de ejecución "secundario".
Básicamente, la estructura es mala. En primer lugar, debería haberse hecho como un proyecto de biblioteca adecuado.
He hecho una demostración de cómo debería haberse hecho aquí .