Repository navigation
Diagnostics es
🌐 Esta página en: English · Português · Español · Français · Deutsch
Todo error y advertencia de compilación que eqc puede imprimir, con lo que significa y qué hacer al respecto. Los códigos son estables: son lo que buscas, y lo que nombraría una supresión.
Esta página se genera desde la misma referencia que comprueba el repositorio: docs/DIAGNOSTICS.md,
sujeta al compilador por DiagnosticsDocumentedTests. Un código que el compilador levante, o que
levanten los propios targets de MSBuild del SDK, sin una fila aquí rompe la compilación, igual que
una fila que nombre un código que ya no existe, y también un código que gane un nuevo lugar de
reporte, lo cual no es una regla de estilo: EQ2101 fue una vez dos errores sin relación (un
desajuste de traducción resx y System.IO en un componente de cliente), cada uno fijado por su
propia prueba en verde, porque los dos nunca se encontraron en una compilación.
Los diagnósticos se imprimen en la forma canónica de MSBuild, así que el IDE y dotnet build los
enlazan ambos:
Pages/Counter.cs(14,9): error EQ2002: C# 'goto' cannot be transpiled to JavaScript …
El proceso eqc en sí, antes o alrededor de una compilación.
| Código | Significado | Qué hacer |
|---|---|---|
EQ0000 |
Un error de compilación llegó sin código propio. | Lee el mensaje: falta el código, no el diagnóstico. |
EQ0001 |
eqc se cayó. | Un fallo en el compilador. El mensaje lleva la excepción; repórtalo con el código fuente que lo provocó. Un caso no es del compilador: los proyectos que la app referencia no pudieron leerse desde su fuente, porque la lista que el SDK escribió para la compilación no está o no tiene ningún proyecto, o un ensamblado o un proyecto que nombra no está. El mensaje nombra qué no se cumplió, y la compilación se detiene ahí, ya que seguir escribiría una página que nombra tipos que nada importa (Desde 0.2.0-preview.62). Compila de nuevo, y repórtalo si persiste. |
EQ0002 |
La lista de referencias de MSBuild está vacía, así que el modelo semántico se construiría desde una compilación incompleta y los argumentos nombrados podrían emitirse en el orden equivocado. | Recompila (dotnet build). Si persiste, CompileEQuanticUI corrió sin FindReferenceAssembliesForReferences. |
Un hueco en el compilador, no en tu código. La construcción es C# legal y podría traducirse; hoy nada lo hace. Estos son los códigos que se encogen a medida que el compilador crece.
| Código | Significado | Qué hacer |
|---|---|---|
EQ1001 |
Una clase de expresión de C# no tiene estrategia de transpilación. | Reescríbela en una forma transpilable, o añade una estrategia de conversión para la construcción. |
EQ1002 |
Una clase de sentencia de C# no tiene estrategia de transpilación. | Como arriba. |
EQ1003 |
Un nodo de C# (ni expresión ni sentencia) no tiene estrategia. | Como arriba. |
EQ1004 |
Una estrategia coincidió con la construcción pero esta forma exacta no tiene emisión: la traducción sería silenciosamente incorrecta, así que se detiene. | Reescribe la forma, o añade el caso que falta a la estrategia. |
EQ1005 |
Dos tipos comparten un nombre de archivo gemelo: o el mismo nombre dos veces, o dos nombres que difieren solo en mayúsculas (un archivo en Windows y en macOS). Sus gemelos serían UN archivo y el segundo sobrescribiría al primero. | Renombra uno de los tipos. |
EQ1006 |
(advertencia) Un tipo está declarado en más de un lugar y eqc emite un módulo por declaración, así que el gemelo solo tiene los miembros de la primera declaración. | Combínalas en una sola declaración, o mantén juntos en una los miembros que un componente usa juntos. Es inocuo cuando las otras mitades son solo de servidor, que es por lo que no detiene la compilación. |
EQ1007 |
Un nombre de método declarado dos veces en un tipo: dos sobrecargas, o dos nombres que bajan a uno (Foo y foo). C# distingue las sobrecargas por sus parámetros, y una clase de JavaScript tiene un miembro por nombre, así que el gemelo se quedaría con una de ellas y toda llamada llegaría a esa: una clase, un record o una clase estática se quedó con la ÚLTIMA, un componente con la PRIMERA, todo en silencio. Un método estático y uno de instancia pueden compartir nombre, las dos mitades de un método parcial son un método, y una implementación explícita de interfaz toma el nombre de la interfaz, que ningún renombrado puede cambiar, así que la comprobación de sobrecargas la deja fuera; junto a un default de otra interfaz toma el nombre de su miembro como cualquier miembro, y se comprueba. Dos defaults que una clase toma de interfaces distintas, o un default y un miembro que la clase declara, aterrizan en un nombre del mismo modo, y lo mismo los mismos pares a lo largo de la cadena de clases: un miembro que una clase derivada declara con el nombre de un default que su base toma (salvo que implemente el miembro de interfaz de ese default, listando la clase la interfaz de nuevo), un default con el nombre de un miembro que una base declara, y dos defaults de miembros de interfaz distintos, uno tomado por una base y otro por la clase derivada. Un indexador toma dos nombres en su gemelo, item para su getter y setItem para su setter, así que un segundo indexador, o cualquier miembro que el gemelo tenga con esos nombres (un método, un campo, una propiedad, un evento, un parámetro de constructor primario que un miembro lee) aterriza en el mismo miembro, y el mensaje nombra qué renombrar. Una implementación explícita del indexador de una interfaz tiene item y setItem, a los que llega todo acceso por la interfaz, y el indexador propio del tipo junto a ella toma nombres propios; lo que un acceso por una interfaz no puede distinguir, dos implementaciones explícitas o una junto a un indexador o a un default que responde a otra interfaz, se rechaza. Los miembros de instancia de un record o de un struct que aterrizan en un nombre también se rechazan: su gemelo guarda el estado de cada instancia como propiedades propias y sus métodos y propiedades calculadas en su prototipo, así que dos de ellos compartían una ranura (struct S(int x) { public int X { get; } = x * 2; } respondía `6 |
6para3 |
EQ1008 |
Una clase se apoya en un miembro de interfaz por defecto de una interfaz compilada en un ensamblado referenciado fuera del SDK. JavaScript no tiene interfaces, así que eqc escribe cada default que una clase toma en su gemelo: convertido desde la fuente de la interfaz cuando la compilación la tiene, y delegado a la copia del runtime para las interfaces propias del SDK (IAppTheme, ICodeLanguage, ICodeCompletionProvider), las interfaces públicas de los ensamblados que el runtime provee. La interfaz de cualquier otro ensamblado no tiene ninguna de las dos, cualquiera sea el namespace que declare, así que el gemelo no tiene tal miembro y una llamada a él en el navegador encontraría undefined. Lo mismo para un default que usa un miembro estático de una interfaz, que no tiene forma de JavaScript que lo guarde. |
Declara el miembro en la clase, o mantén la clase fuera del código de cliente. |
EQ1009 |
Un constructor de un record, de un struct o de una clase simple al que su gemelo no puede llegar (el de una clase simple Desde 0.2.0-preview.61). Una clase de JavaScript tiene un constructor, así que su gemelo toma una rama por constructor de C# según cuántos argumentos llegaron, contando sus parámetros opcionales: cada constructor que hace su propio trabajo (el primario, o uno explícito que no encadena con : this(…)) enlaza sus parámetros, fija los miembros, llama al constructor de su base y ejecuta su cuerpo, y cada uno que encadena ejecuta aquel al que encadena tras evaluar los argumentos de la cadena. Un constructor que toma un número de argumentos que otro también toma no puede distinguirse de él, y uno que encadena a un constructor que a su vez encadena, o : this() al constructor implícito de un struct junto a constructores propios, llega a su trabajo por nada. El constructor de copia de un record (protected R(R original)) no es una rama: new nunca llega a él (Desde 0.2.0-preview.61). Tampoco lo es el constructor que solo llaman las serializaciones de .NET, (SerializationInfo, StreamingContext), que la plantilla de excepción de Visual Studio escribe junto a (string, Exception): el navegador no tiene SerializationInfo, y una clase de excepción de la app es una clase cuyos constructores se comprueban como los de cualquier clase (Desde 0.2.0-preview.61). Una llamada de una que el navegador haría, un new, o la cláusula : base(…), : this(…) o de base de un constructor que el gemelo escribe, se rechaza, ya que sin rama para ella la llamada ejecutaría otro constructor de dos argumentos (new Snap(info, context) ejecutaba Snap(string, string)); la propia de la plantilla llama a la de su base, no es una rama, y no hace ninguna llamada (Desde 0.2.0-preview.61). |
Dale al constructor un número de argumentos propio, o encadénalo a uno que haga su propio trabajo. Una fábrica estática (static Coded FromText(string text) => new(text.Length)) dice lo mismo sin un segundo constructor. Construye un objeto cuyo constructor de serialización alcance una llamada a través de otro de sus constructores. |
No es un hueco: no hay equivalente en el navegador, o una traducción tendría que ser una conjetura. Estos no se encogen con el trabajo del compilador: son la forma del destino.
| Código | Significado | Qué hacer |
|---|---|---|
EQ2001 |
Una construcción de C# sin equivalente en tiempo de ejecución en el navegador (intrínsecos de referencia tipada: __makeref, __reftype, __refvalue, stackalloc, punteros). |
Reestructura sin ella. |
EQ2002 |
goto. |
Reestructura con bucles y condicionales, o con un break/continue etiquetado (esos SÍ se traducen). |
EQ2003 |
new T() sobre un parámetro de tipo: los argumentos genéricos se borran en tiempo de ejecución en JavaScript, así que el tipo concreto es desconocido. |
Pasa una fábrica (Func<T>) o el valor ya construido. |
EQ2004 |
Un miembro sin traducción a JavaScript: un método de extensión cuya clase declarante no es parte de esta compilación, o una llamada para la que el transpilador no mapea nada (Stopwatch.StartNew, Roslyn…) dentro de una clase que refleja, escrita cualificada o alcanzada a secas por using static (WriteLine bajo using static System.Console, desde 0.2.0-preview.60). También un valor System.Range almacenado en vez de usado para indexar, o entregado a un indexador que toma el propio Range (this[Range r], desde 0.2.0-preview.61). |
Usa un miembro de instancia o trae la fuente declarante; añade una estrategia; para un rango, indexa con él directamente (text[a..b]), o dale al tipo un Length (o un Count) y un Slice(int start, int length), que un rango llama; mueve la llamada detrás de un [ServerAction]; o, cuando la clase entera solo corre en el servidor, marca la CLASE [ServerOnly] y no se emite módulo para ella (0.2.0-preview.46). |
EQ2005 |
Un iterador infinito. Los iteradores se MATERIALIZAN en un arreglo, así que el bucle correría para siempre en vez de producir perezosamente. | Dale un fin al bucle (una cota, un yield break), o toma lo que necesitas dentro del método. |
EQ2006 |
El miembro no se enlaza en el modelo semántico, así que cualquier traducción sería una conjetura. | O el código no compila, o a eqc le faltan referencias o fuentes generadas. Nunca se conjetura: ver Compilador. |
EQ2007 |
Un comparador que cambia lo que una colección considera igual o en orden: el argumento with(…) de una expresión de colección más allá de una pista de capacidad, o un comparador entregado al constructor de una colección (new Dictionary<string, T>(StringComparer.OrdinalIgnoreCase)) o a un operador de LINQ que encuentra sus claves o sus elementos por él (ToHashSet, y ToDictionary, ToLookup, GroupBy y Distinct desde 0.2.0-preview.61). Una lista, un conjunto o un diccionario encuentra un elemento por la igualdad por defecto de su tipo y no toma otra: los comparadores por defecto y StringComparer.Ordinal pasan. Una ordenación o una búsqueda binaria toma el comparador por defecto del tipo, un Comparison<T>, los seis de un StringComparer, Comparer<T>.Create y un comparador que escribas, y rechaza solo uno que ningún gemelo lleva (un StringComparer hecho para una cultura, un comparador que una biblioteca compiló). |
Quita el comparador, o normaliza las claves tú (pásalas a minúsculas a la entrada y en cada búsqueda). Para una ordenación, pasa un Comparison<T>. |
EQ2008 |
Sintaxis de consulta usando join, let, un segundo from, o into: su traducción a C# pasa por identificadores transparentes generados por el compilador. También las formas de inicializador con cerca. |
Reescribe en sintaxis de método, donde todo operador está soportado. |
EQ2009 |
Un componente está declarado más de una vez en un archivo (declaraciones parciales). eqc emite un módulo por declaración y no puede fusionarlas. | Combina los miembros en una sola declaración. |
EQ2010 |
Un símbolo que el framework mantiene en el HOST, un tipo o un único miembro marcado [ServerOnly], nombrado desde código de cliente. El runtime no entrega gemelo, así que la referencia compilaría, emitiría y fallaría en la hidratación con «does not provide an export named» mientras el SSR seguía respondiendo 200. Un método de extensión llamado sobre un valor que cruza nombra también su hogar: curve.Ease(t) es CurveEvaluator.Ease(curve, t), y fallaba en la llamada. Un tipo declarado dentro de uno que nunca cruza (una clase [ServerOnly] o un atributo) tampoco tiene gemelo, como su dueño no tiene ninguno, mientras que uno declarado dentro de una clase de excepción de la app cruza como esa clase, así que el código de cliente que llega a él se rechaza igual, como sea que llegue: su nombre, un alias, using static, un operador o una conversión que su valor trae, o un cero. Un módulo que importaría su gemelo lo reporta en la declaración que contiene la referencia (Desde 0.2.0-preview.61). Un miembro marcado [ServerOnly] se rechaza donde sea que el código de cliente lo nombre, incluido el código de su propio tipo: un componente deja tal método fuera de su gemelo, y su propio Build llamándolo era una llamada a un miembro que el gemelo no tiene (Desde 0.2.0-preview.62). |
Llámalo desde código de servidor: un [ServerAction], una clase [ServerOnly], o un realizador. Nunca desde el Build de un componente. A diferencia de EQ2004 esto es una DECISIÓN, no un hueco: añadir una estrategia no es la respuesta. |
EQ2011 |
Un miembro que tomaría un nombre que el componente del runtime ya usa. C# mantiene aparte un parámetro de constructor primario, un campo y una propiedad, y los escribe distinto del camelCase del runtime; JavaScript lo pliega todo sobre this.<name>, así que la asignación reemplaza al miembro del runtime y la página falla solo en el navegador. La lista se lee del runtime vivo, nunca se escribe a mano. |
Renombra el miembro. Un override está exento: el Build de un componente está hecho para reemplazar el build del runtime, y reemplazar un miembro de la base es para lo que uno sirve, pero un método simple no lo está: public void Mount() { } no sobrescribe nada y aun así emite mount() sobre el propio del runtime, así que el componente nunca se monta. |
EQ2012 |
Un [ServerAction] en un componente ABSTRACTO. El servidor registra una acción con el nombre del componente CONCRETO que la lleva, salta los tipos abstractos y recorre los métodos heredados, así que sirve Tile/Load mientras un stub emitido en la base invocaría CardBase/Load. Nada sirve ese id y la página recibe «action not found», en ambos lados en silencio. |
Declara la acción en el componente concreto. Un alias no es la respuesta: el descriptor lleva el TIPO de componente sobre el que invocar, así que dos hijos que heredan una acción le dan dos respuestas al id de la base; el dueño de una acción heredada es una decisión, no un parche. |
EQ2013 |
Un tipo del vocabulario cuya mitad de navegador revive los valores de un argumento de tipo (ServerTopic<T>) se construye donde ese argumento es, o contiene, un parámetro de tipo, como en static ServerTopic<T> Topic<T>(string name) => new(name). JavaScript borra el tipo ahí, así que el topic no llevaría spec y toda carga llegaría a sus suscriptores sin revivir: un decimal o un long como el texto que escribe el cable, un record sin sus miembros. |
Construye el topic donde su tipo de carga es concreto, como miembro estático del tipo que declara los topics de la app: static ServerTopic<RoomEvent> Room(string id) => new($"room:{id}"). Ver Eventos de servidor. |
EQ2014 |
Un tipo de excepción se construye o se prueba donde un argumento de tipo que lleva, el suyo o uno de un tipo en el que está anidado, es, o contiene, un parámetro de tipo, como en static Exception Of<T>() => new Failed<T>(), catch (Failed<T>), o new Missing() dentro de la clase genérica que lo declara. Una excepción lleva los tipos que es, que un catch tipado, un is y su nombre leen, y JavaScript borra un parámetro de tipo, así que la excepción llevaría, o la prueba compararía, T mismo: catch (Failed<int>) no atrapaba lo que Of<int>() lanzaba (Desde 0.2.0-preview.61). |
Construye y prueba una excepción donde sus argumentos de tipo son tipos concretos, y declara una clase de excepción fuera de un tipo genérico. |
El contrato de localización, comprobado en la máquina de compilación y no cuando llega un visitante.
| Código | Significado | Qué hacer |
|---|---|---|
EQ2100 |
Sobre esta llamada: la plantilla debe ser un formato compuesto válido cuyos especificadores estén dentro del subconjunto soportado, y la llamada debe pasar cada hueco que declara. | Corrige el número de argumentos, o quita el especificador fuera del subconjunto (la alineación como {0,10} está fuera de v1). |
EQ2101 |
Sobre las traducciones: el resx de cada cultura se sujeta al neutral, que es el contrato de aridad. | Corrige la plantilla de la cultura: un {n} perdido o de más rompe la compilación, no la página. |
Un componente de cliente buscó una API que solo existe en un servidor, o un valor que solo el
servidor tiene. El puente es [ServerAction].
| Código | Significado |
|---|---|
EQ2102 |
Acceso directo a base de datos (Microsoft.EntityFrameworkCore, System.Data). |
EQ2103 |
Red (System.Net.Http, System.Net.Sockets). |
EQ2104 |
Hilos y bloqueo del SO (Thread, Monitor, Mutex, Semaphore, no Task). |
EQ2105 |
Lanzar procesos (System.Diagnostics.Process). |
EQ2106 |
Interoperabilidad nativa / P-Invoke (System.Runtime.InteropServices). |
EQ2107 |
Generación de IL en tiempo de ejecución (System.Reflection.Emit). |
EQ2112 |
Acceso al sistema de archivos (System.IO). |
EQ2114 |
Una página usa un valor que le dio el contenedor del servidor (un parámetro de constructor de un tipo de clase, o un miembro donde la página guarda uno) de un modo que la compilación no puede seguir: un método llamado sobre él, el valor pasado donde la compilación no tiene fuente, convertido a texto, comparado, enumerado, guardado en una colección, leído por un miembro que un tipo de .NET declara sobre un valor que no cruza entero (el Count de una lista o de un conjunto de objetos, el Value de un par), leído por un tipo cuyo miembro de ese nombre el propio tipo del valor oculta (new), o leído mientras la página se construye. Tal valor cruza al navegador solo como lo que el navegador lee de él, así que un uso que la compilación no puede ver dibujaría otra cosa allí. Lo reporta el generador de código fuente, así que se ve en el editor. Decide en el servidor, en PrefetchAsync o en un miembro [ServerOnly], y guarda el resultado en un campo; o llama a un [ServerAction] cuando el estado del navegador es una entrada. |
EQ2114 llegó en 0.2.0-preview.60, cuando un servicio que el contenedor entrega a una página dejó de
cruzar entero (ver Integración con el servidor).
EQ2112 queda aparte de su familia a propósito: System.IO se reportaba como EQ2101 hasta que ese
código resultó pertenecer a la comprobación de resx de arriba, que el wiki ya había publicado. No es
un desliz de numeración que haya que ordenar.
La construcción se traduce, pero se LEERÍA distinta en el servidor y en el navegador. En vez de elegir por ti, eqc pregunta.
| Código | Significado | Qué hacer |
|---|---|---|
EQ2108 |
Un CultureInfo que el navegador no puede seguir: el formateo cruza InvariantCulture y CurrentCulture, y leer un número (Parse/TryParse sobre cualquier tipo numérico, Convert.ToInt32 y sus hermanos sobre una cadena, Convert.ToDecimal sobre una cadena o sobre un valor que pueda contener una, como un object) solo InvariantCulture. Convert.ToBoolean nunca consulta su proveedor pero C# lo evalúa, así que cruza InvariantCulture, CurrentCulture y un nulo, que son lecturas sin efecto, y cualquier otro proveedor que una app escriba, mientras que otro CultureInfo (GetCultureInfo(name), new CultureInfo(name)), que puede lanzar, no tiene gemelo que lo evalúe. La cultura es la propiedad a la que el proveedor se enlaza, como sea que se escriba: un miembro de otro tipo que también se llame InvariantCulture se rechaza, ya que puede devolver cualquier cultura. |
Formatea con un especificador explícito (ToString("N2") sigue la cultura de la app en ambos destinos), o convierte y lee con la cultura invariante. |
EQ2110 |
Un número leído desde texto (o desde un valor que pueda contener texto, como un object) sin cultura alguna: C# lee en la cultura de la petición ("1,5" es 1,5 en pt) y el navegador en la invariante. Un número escrito como texto no necesita cultura: ambos destinos escriben el texto de la cultura. |
Di cuál quieres: pasa CultureInfo.InvariantCulture. |
EQ2111 |
GetService sin argumento de tipo que cruzar: el registro se indexa por el NOMBRE de la interfaz, y no hay nada por lo que indexar. |
Llama a la sobrecarga genérica. |
EQ2113 |
ConfigureAwait se descarta, hay un solo contexto al que volver, y descartarlo tiraría un argumento NO CONSTANTE sin evaluarlo. |
Pasa una constante, o evalúa la expresión en una variable local primero. |
| Código | Significado |
|---|---|
EQ3001 |
Una app Photon no tiene programa. |
EQ3002 |
Una app Photon tiene más de un programa. |
EQ3003 |
La razón de una capacidad debe ser una constante. |
EQ3004 |
La clave de una autorización debe ser una constante: se firma en la app en tiempo de compilación, así que una clave construida en tiempo de ejecución nunca llega a la firma. |
EQ3005 |
Un dato del bundle debe ser constante: el Info.plist se escribe en tiempo de compilación, así que un argumento construido en tiempo de ejecución nunca llega al manifiesto de la app. Cuenta cualquiera de los argumentos, y lo que sea que el método tome: una cadena, un bool, un AppCategory. |
EQ3006 |
Una app Photon escribe su propio punto de entrada. El SDK genera uno desde CreateApp, así que una app que conservó su Main (o sus sentencias de nivel superior) tiene dos, lo cual el compilador reporta como CS0017 contra un archivo generado que la app nunca ha visto. Borra el de la app: lo que hiciera primero pertenece a CreateApp, que es la única mitad que Android ejecuta. |
EQ3007 |
Un esquema que una app de teléfono abre debe ser una constante. Un teléfono responde CanOpen solo para los esquemas que su manifiesto lista (LSApplicationQueriesSchemes en iOS, queries en Android), y el manifiesto se escribe en tiempo de compilación, así que un esquema pasado a builder.Workspace.Opens(…) o a OpenUrlPolicy.Allowing(…) que se construya en tiempo de ejecución abriría sus enlaces y aun así se le diría que nada los abre. Se reporta solo donde se escribe un manifiesto: una app de escritorio lee la línea solo en tiempo de ejecución. |
La superficie de fábrica generada y los modelos de formulario.
| Código | Significado |
|---|---|
EQ3101 |
Un componente elige más de un constructor de fábrica ([UiFactory]). |
EQ3102 |
Dos componentes comparten nombre. |
EQ3103 |
Una propiedad de modelo de formulario tiene un tipo que ningún cuadro de texto puede contener. |
EQ3104 |
Un atributo de validación no tiene regla en la que convertirse. |
EQ3105 |
Un [Compare] nombra una propiedad que este formulario no tiene. |
Levantados por los propios targets de MSBuild del SDK, antes o después de que corra el compilador.
| Código | Significado | Qué hacer |
|---|---|---|
EQ4001 |
La herramienta de iconos de eQuantic, eqicon, que escribe los iconos de la app, el catálogo vectorial, el manifiesto de capacidades y el bundle de macOS, no está donde el SDK la busca. En una compilación desde el árbol de fuentes del repositorio, eQuantic.UI.Native.Build no se compiló antes de este proyecto: un grafo de compilación roto. Desde un paquete, el paquete se entregó sin tools/net10.0/eqicon.dll. |
Ninguno se arregla compilando dos veces. Desde la fuente, la herramienta es un ProjectReference de todo proyecto de app, así que mira los errores arriba de este, la compilación de la propia herramienta falló, o a quien quitó la arista. Desde un paquete, limpia la caché de eQuantic (dotnet msbuild -t:ClearEQuanticCache), restaura de nuevo, y reporta la versión del paquete si persiste. |
EQ4002 |
El compilador de eQuantic, eqc, que convierte los componentes de la app en JavaScript, no está donde el SDK lo busca: en una compilación desde el árbol de fuentes del repositorio, eQuantic.Build no se compiló antes de este proyecto; desde un paquete, el paquete se entregó sin tools/net10.0/eqc.dll; o un EqcCliPath explícito nombra un archivo que no está. Esto era antes una advertencia, y una página sin JavaScript. |
Como EQ4001: no se arregla compilando dos veces. Desde la fuente, lee los errores arriba de este o restaura el ProjectReference; desde un paquete, limpia la caché de eQuantic y restaura; con un EqcCliPath explícito, corrige la ruta. |
EQ4003 |
(advertencia) La app se firmará con una excepción del runtime endurecido (com.apple.security.cs.*, la familia que relaja una protección que el runtime endurecido impone) mientras la compilación no está endurecida. La clave llega a la firma y el sistema nunca la consulta. El SDK firma con --options runtime solo cuando EQuanticHardenedRuntime es true, así que cualquier otro valor no vacío es una compilación no endurecida, false, off, y el error de tipeo ture por igual, y el mensaje cita de vuelta lo que se escribió. Un valor VACÍO es una compilación de desarrollo ordinaria y nunca se reporta. |
Pon EQuanticHardenedRuntime=true, o quita la declaración. No EQuanticSigningIdentity: eso activa el endurecimiento solo donde la propiedad está vacía, así que no responde a esto. Nota lo que esto NO significa: los permisos del App Sandbox (com.apple.security.network.*, …files.*, …device.*) responden a PhotonEntitlements.AppSandbox, no al runtime endurecido, y una compilación de desarrollo ad-hoc los honra, así que nunca se reportan aquí. |
EQ4004 |
Un programa que la compilación inició terminó con un código de salida distinto de cero y no reportó error propio: eqc, eqicon, bun, git, o en macOS codesign, ditto, notarytool, stapler o hdiutil. El mensaje nombra el programa y los argumentos con los que se inició, como el Exec de MSBuild nombró su comando, salvo para una llamada cuya línea de comandos no se repite: la del notario, que lleva una contraseña. Un programa que reportó sus propios errores, los códigos EQ de eqc por ejemplo, no recibe un EQ4004 después de ellos. |
Ejecuta el comando que el mensaje nombra, desde la carpeta del proyecto, para ver qué dice el programa. Un programa que no está en la máquina en absoluto es el MSB6003 propio de MSBuild. |
🏁 Empieza aquí
🏗️ Arquitectura
- Visión general de la arquitectura
- Componentes write-once
- Superficie declarativa
- Arquitectura de paquetes
- Componentes
- Estilos
- Localización
- Analytics y GTM
📱 Write-once
- Motor Photon
- Design System
- Capacidades
- Almacenamiento
- Formularios
- Editor de código
- Markdown
- Mermaid
- Renderizado de email
⚙️ Compilación
⚡ Runtime
🔌 Servidor
🎨 Ecosistema
🚀 Desarrollo