Estoy tratando de ejecutar una versión modificada de la muestra HelloWeb para ASP.NET vNext en DNX usando Kestrel. Entiendo que esto es muy mucho en la punta de lanza, pero espero que el equipo de ASP.NET sería, al menos, mantener el trabajo más simple aplicación web posible :)
Ambiente:
- Linux (Ubuntu, más o menos)
- Mono 3.12.1
- DNX 1.0.0-beta4-11257 (también tengo 11249 disponible)
Código de "aplicación web", en Startup.cs
:
using Microsoft.AspNet.Builder;
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseWelcomePage();
}
}
Configuración del proyecto, en project.json
:
{
"dependencies": {
"Kestrel": "1.0.0-beta4",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta4",
"Microsoft.AspNet.Hosting": "1.0.0-beta4",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta4",
"Microsoft.Framework.Runtime": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Common": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Loader": "1.0.0-beta4",
"Microsoft.Framework.Runtime.Interfaces": "1.0.0-beta4",
},
"commands": {
"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
},
"frameworks": {
"dnx451": {}
}
}
kpm restore
Parece funcionar bien.
Sin embargo, cuando intento ejecutar, recibo una excepción que sugiere que Microsoft.Framework.Runtime.IApplicationEnvironment
no se puede encontrar. Línea de comando y error (algo reformateado)
.../HelloWeb$ dnx . kestrel
System.IO.FileNotFoundException: Could not load file or assembly
'Microsoft.Framework.Runtime.IApplicationEnvironment,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
or one of its dependencies.
File name: 'Microsoft.Framework.Runtime.IApplicationEnvironment,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke
(System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder,
System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00000] in <filename unknown>:0
Aunque, obviamente, mi necesidad más urgente es solucionar esto, también agradecería consejos sobre cómo avanzar para diagnosticar lo que está mal para poder solucionar problemas similares yo mismo en el futuro. (También es probable que esta pregunta sea más útil para otros también).
Lo he encontrado Microsoft.Framework.Runtime.IApplicationEnvironment
en la Microsoft.Framework.Runtime.Interfaces
fuente de ensamblaje , y eso no parece haber cambiado recientemente. No está claro por qué la excepción muestra el nombre como si fuera un conjunto completo en sí mismo, en lugar de solo una interfaz dentro de otro conjunto. Supongo que esto puede deberse a interfaces de montaje neutrales , pero el error no lo aclara. ( [AssemblyNeutral]
está muerto, así que no es así ... )
fuente
Respuestas:
Buena pregunta. Para su problema específico, parece que tiene una falta de coincidencia en sus dependencias resueltas. Cuando suceden cosas como esta es probable porque esté ejecutando su aplicación en un dnx incompatible. Todavía estamos haciendo grandes cambios importantes, por lo que si alguna vez ve que falta un método del tipo que falta, es probable que termine ejecutando
betaX
paquetes ybetaY
dnx o viceversa.Incluso más específicamente, las interfaces de montaje neutral se eliminaron en beta4, pero parece que la aplicación que está ejecutando todavía las está utilizando.
Tenemos planes de hacerlo para que los paquetes puedan marcar el dnx mínimo que requieren para ejecutarse para que el mensaje de error sea más claro. Además, a medida que pasa el tiempo, los cambios importantes desaparecerán.
Sin embargo, en general, siento que es hora de que escriba una guía sobre cómo diagnosticar problemas como este al usar el dnx (ya que es bastante diferente al .NET existente).
Las dependencias que ingresas
project.json
son solo de nivel superior. Las versiones también son siempre mínimas (es como un paquete NuGet). Esto significa que cuando especificasFoo 1.0.0-beta4
realmente estás especificandoFoo >= 1.0.0-beta4
. Esto significa que si solicitaMVC 0.0.1
y las versiones mínimas en su feed configurado esMVC 3.0.0
, obtendrá esa. También NUNCA hacemos flotar su versión a menos que usted la especifique. Si solicita 1.0.0 y existe, obtendrá 1.0.0 incluso si existen versiones más recientes. Especificar versiones vacías SIEMPRE es malo y no se permitirá en versiones posteriores.Hay una nueva característica que estamos presentando a nuget llamada versiones flotantes. Hoy solo funciona en la etiqueta de prelanzamiento, pero en la próxima versión funcionará en más partes de la versión. Esto es similar a la sintaxis npm y gem para especificar rangos de versión en el archivo de especificación del paquete.
1.0.0-*
- Significa darme la versión MÁS ALTA que coincida con el prefijo (de acuerdo con las reglas de versiones semánticas ) O si no hay una versión que coincida con ese prefijo, use el comportamiento normal y obtenga la versión MÁS BAJA> = la versión especificada.Cuando ejecute la restauración en las últimas compilaciones, escribirá un archivo llamado
project.lock.json
. Este archivo tendrá el cierre transitivo de dependencias para todos los marcos de destino definidos enproject.json
.Cuando algo como esto falla, puede hacer lo siguiente:
Echa un vistazo a las dependencias resueltas usando
kpm list
. Esto le mostrará las versiones resueltas de los paquetes a los que hace referencia su proyecto y qué dependencia lo incorporó. Por ejemplo, si A -> B, mostrará:Salida de la lista KPM real:
Listado de dependencias para ClassLibrary39 (C: \ Users \ davifowl \ Documents \ Visual Studio 14 \ Projects \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)
* significa dependencia directa.
Si tiene un estudio visual en funcionamiento (que rompe con DNX en este momento), puede mirar el nodo de referencias. Tiene los mismos datos representados visualmente:
Veamos cómo se ve una falla de dependencia:
Aquí está el proyecto.json
Newtonsoft.Json 8.0.0
no existe Entonces ejecutar kpm restore muestra lo siguiente:Cuando diagnostique cuándo pudo haber fallado la restauración, mire las solicitudes HTTP realizadas, le informan qué fuentes de paquetes configuradas buscó kpm. Observe en la imagen de arriba que hay una
CACHE
solicitud. Este es el almacenamiento en caché integrado basado en el tipo de recurso (nupkg o nuspec) y tiene un TTL configurable (mirarkpm restore --help
). Si desea forzarkpm
a golpear las fuentes remotas de NuGet, use la--no-cache
bandera:Estos errores también aparecen en Visual Studio en la ventana de salida del registro del administrador de paquetes:
Nota al margen!
Fuentes de paquete
Describiré la forma en que NuGet.config funciona en este momento (lo que probablemente cambiará en el futuro). Por defecto, tiene un NuGet.config con la fuente predeterminada de NuGet.org configurada globalmente en
%appdata%\NuGet\NuGet.Config
. Puede administrar estas fuentes globales en Visual Studio o con la herramienta de línea de comandos NuGet. Siempre debe mirar sus fuentes efectivas (las que figuran en la salida de kpm) al intentar diagnosticar fallas.Lea más sobre NuGet.config aquí
De vuelta a la realidad:
Cuando las dependencias no se resuelven, ejecutar la aplicación le dará esto:
El tiempo de ejecución básicamente intenta validar que todo el gráfico de dependencia se resuelva antes de intentar ejecutarse. Si sugiere ejecutar
kpm restore
es porque no puede encontrar las dependencias enumeradas.Otra razón por la que puede obtener este error es si está ejecutando el sabor dnx incorrecto. Si su aplicación solo especifica dnx451 e intenta ejecutar CoreCLR dnx, es posible que vea un problema similar. Presta mucha atención al marco de destino en el mensaje de error:
Para correr:
Cuando usted está tratando de correr, usted debe recordar que la cartografía mental, de CLR para marco objetivo definido en su
project.json
.Esto también aparece en Visual Studio en el nodo de referencias:
Los nodos marcados como amarillos no están resueltos.
Estos también aparecen en la lista de errores:
edificio
Estos errores también aparecen al construir. Al construir desde la línea de comandos, el resultado es muy detallado y puede ser extremadamente útil al diagnosticar problemas:
El resultado muestra todos los ensamblados pasados al compilador desde paquetes y referencias de proyectos. Cuando comience a tener fallas de compilación, es útil mirar aquí para asegurarse de que el paquete que está utilizando realmente funcione en esa plataforma de destino.
Aquí hay un ejemplo de un paquete que no funciona en dnxcore50:
Microsoft.Owin.Host.SystemWeb versión 3.0.0 no tiene ningún ensamblado que se ejecute en dnxcore50 (eche un vistazo a la carpeta lib del paquete descomprimido). Cuando corremos
kpm build
:Observe que dice "usando el paquete Microsoft.Owin.Host.SystemWeb" pero no hay "Archivo:". Este podría ser el motivo de un error de compilación.
Aquí termina mi cerebro volcado
fuente
Todavía no sé del todo qué estaba mal, pero ahora tengo una serie de pasos para al menos hacer que sea más fácil probar cosas:
~/.config/NuGet.config
para asegurarse de que está utilizando los feeds NuGet correctosTerminé usando la siguiente línea de comando para probar varias opciones de una manera razonablemente limpia:
Parece que mi problema se debió realmente a las versiones incorrectas de las dependencias que se están instalando. Al
"1.0.0-beta4"
parecer, un número de versión es bastante diferente a"1.0.0-beta4-*"
. Por ejemplo, laKestrel
dependencia instaló la versión 1.0.0-beta4-11185 cuando se acaba de especificar como1.0.0-beta4
, pero la versión 1.0.0-beta4-11262 con-*
el final. Quería especificarbeta4
explícitamente para evitar usar accidentalmente una versión beta3 con elLa siguiente configuración del proyecto funciona bien:
fuente
-*
siempre te ofrece la última versión preliminar, mientras que sin ella obtienes la versión más baja que satisface todas las dependencias (como es habitual con NuGet). Esta prueba tiene algunos ejemplos."frameworks": {"dnx451": {}}
me lo arreglaron, no es necesariodnxcore50
dnvm upgrade-self
, esto no se actualizaría a la última versión. La ejecución del símbolo del sistema VS como administrador mostró la versión dnvm comorc1...
, sin embargo, cuando no era como administrador, erabeta5...
. Después de su comando, las indicaciones de los comandos admin y no admin se muestran como larc2...
versión (más reciente).dnx451
odnxcore50
esta respuesta me ayudó a entender este tema un poco más: stackoverflow.com/a/30846048/89590 Respuesta corta:dnx451
es apropiado para mono.Puede configurar una variable de entorno llamada
DNX_TRACE
a1
para ver una TONELADA más información de diagnóstico. ¡Ten cuidado, es mucha más información!fuente
Para que funcione, modifiqué mi
project.json
... ahora se ve así:La clave parecía ser la sección de marcos.
También el cambio de nombre cambió cómo
k web
funciona para que sea ahoradnx . web
odnx . kestrel
Actualización - poco más información
Curiosamente, después de ejecutar sin marcos definidos, fue y obtuve un montón de cosas adicionales cuando lo hice
kpm restore
:.. entonces funcionó bien. Luego volví a la sección del marco
.. y todavía funcionó, mientras que antes arrojaría un error!
¡Muy raro!
(Estoy corriendo
1.0.0-beta4-11257
)Actualización adicional
Creé una nueva instancia de Ubuntu, y obtuve el mismo error que tú. Pensé que el problema podría ser causado por solo tratar de obtener paquetes
nuget.org
y nomyget.org
(que tiene las cosas más nuevas), así que me metí enNuGet.Config
el raíz del proyecto .... esto parece haberme solucionado al obtener las versiones correctas (después de otra
kpm restore
).fuente
En estos días, todas mis
package.json
versiones terminan en"-rc2-*"
(Solo las excepciones que he visto hasta ahora son los
Microsoft.Framework.Configuration
paquetes, que deben ser"1.0.0-rc1-*"
o"1.0.0-*"
)Con respecto a los "trenes de versiones" que @davidfowl menciona, parece que mucho dolor ha desaparecido entre beta8 y rc2.
He tenido más suerte
coreclr
con estos 2 feeds NuGet:Cuando hago hayan desaparecido los problemas de paquetes, el 90% de las veces son estos mismos culpables:
La mayoría de las veces, puedo evitarlos forzando el feed principal de NuGet.org:
Aquí está mi config.json de trabajo:
fuente
Tenía problemas de falta de dependencia también al tratar de apaciguar las referencias dnxcore50 y dnx451.
Si entiendo este derecho "dependencias": {} se comparten entre los marcos.
Entonces "dependencias": {} dentro de los "marcos": son específicos de ese marco.
dnxcore50 es un tiempo de ejecución modular (autónomo), por lo que básicamente contiene todos los tiempos de ejecución principales necesarios para ejecutar un programa a diferencia del marco de trabajo .net clásico, donde hay dependencias centrales dispersas en otros lugares.
Dicho esto, quería mantener el enfoque mínimo en caso de que decidiera alojar en Mac o Linux en algún momento.
La actualización se encontró con problemas de dependencia extraños con vistas cshtml, solo fui con dnx451 por ahora.
Este es mi proyecto.json
fuente