Ich versuche, eine modifizierte Version des HelloWeb-Beispiels für ASP.NET vNext unter DNX mit Kestrel auszuführen. Ich verstehe, dass dies sehr auf dem neuesten Stand ist, aber ich würde hoffen, dass das ASP.NET-Team zumindest die einfachste Web-App zum Laufen bringt :)
Umgebung:
- Linux (Ubuntu, so ziemlich)
- Mono 3.12.1
- DNX 1.0.0-beta4-11257 (ich habe auch 11249 verfügbar)
"Web App" Code, in Startup.cs
:
using Microsoft.AspNet.Builder;
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseWelcomePage();
}
}
Projektkonfiguration, in 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
scheint gut zu funktionieren.
Wenn ich jedoch versuche zu laufen, wird eine Ausnahme angezeigt, Microsoft.Framework.Runtime.IApplicationEnvironment
die darauf hinweist, dass sie nicht gefunden werden kann. Kommandozeile und Fehler (etwas neu formatiert)
.../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
Mein dringendstes Bedürfnis ist es natürlich, dies zu beheben. Ich würde mich auch über Ratschläge freuen, wie ich vorgehen kann, um zu diagnostizieren, was falsch läuft, damit ich ähnliche Probleme in Zukunft selbst beheben kann. (Das wird diese Frage wahrscheinlich auch für andere nützlicher machen.)
Ich habe Microsoft.Framework.Runtime.IApplicationEnvironment
in der Microsoft.Framework.Runtime.Interfaces
Assembly-Quelle gefunden , und das scheint sich in letzter Zeit nicht geändert zu haben. Es ist nicht klar, warum die Ausnahme den Namen so anzeigt, als wäre es eine ganze Baugruppe an sich und nicht nur eine Schnittstelle innerhalb einer anderen Baugruppe. Ich vermute , dies kann zu fällig Montag neutral Schnittstellen , aber es ist von dem Fehler nicht klar. ( [AssemblyNeutral]
ist tot, das ist es also nicht ... )
quelle
Antworten:
Gute Frage. Für Ihr spezifisches Problem sieht es so aus, als ob Ihre aufgelösten Abhängigkeiten nicht übereinstimmen. Wenn solche Dinge passieren, liegt es wahrscheinlich daran, dass Sie Ihre Anwendung auf einem inkompatiblen DNX ausführen. Wir nehmen immer noch große Änderungen vor. Wenn Sie also jemals feststellen , dass eine Methode vom Typ fehlt, werden Sie wahrscheinlich
betaX
Pakete undbetaY
dnx ausführen oder umgekehrt.Insbesondere wurden Assembly Neutral Interfaces in Beta4 entfernt, aber es sieht so aus, als ob die Anwendung, die Sie ausführen, sie noch verwendet.
Wir haben vor, dies so zu gestalten, dass Pakete den Mindest-DNX markieren können, den sie ausführen müssen, um die Fehlermeldung deutlicher zu machen. Auch im Laufe der Zeit werden die brechenden Veränderungen nachlassen.
Im Allgemeinen ist es jedoch an der Zeit, einen Leitfaden zur Diagnose solcher Probleme bei der Verwendung von dnx zu schreiben (da dies ziemlich anders ist als bei vorhandenem .NET).
Abhängigkeiten, die Sie eingeben,
project.json
sind nur oberste Ebene. Versionen sind auch immer Mindestversionen (es ist wie bei einem NuGet-Paket). Dies bedeutet, dass Sie bei der AngabeFoo 1.0.0-beta4
wirklich angebenFoo >= 1.0.0-beta4
. Dies bedeutet, wenn Sie nachfragenMVC 0.0.1
und die Mindestversion für Ihren konfigurierten Feed istMVC 3.0.0
, erhalten Sie diese. Wir veröffentlichen Ihre Version auch NIEMALS , es sei denn, Sie geben sie an. Wenn Sie nach 1.0.0 fragen und es existiert, erhalten Sie 1.0.0, auch wenn neuere Versionen existieren. Die Angabe leerer Versionen ist IMMER schlecht und wird in späteren Builds nicht zugelassen.Es gibt eine neue Funktion, die wir in Nuget einführen: Floating-Versionen. Heute funktioniert es nur mit dem Prerelease-Tag, in der nächsten Version jedoch mit mehr Teilen der Version. Dies ähnelt der npm- und gem-Syntax zum Angeben von Versionsbereichen in der Paketspezifikationsdatei.
1.0.0-*
- Bedeutet, dass ich die HÖCHSTE Version habe, die mit dem Präfix übereinstimmt (gemäß den Regeln für die semantische Versionierung ) ODER wenn es keine Version gibt, die mit diesem Präfix übereinstimmt, verwenden Sie normales Verhalten und erhalten Sie die NIEDRIGSTE Version> = die angegebene Version.Wenn Sie die Wiederherstellung in den neuesten Builds ausführen, wird eine Datei namens aufgerufen
project.lock.json
. Diese Datei hat den transitiven Abschluss von Abhängigkeiten für alle in definierten Ziel-Frameworksproject.json
.Wenn so etwas fehlschlägt, können Sie Folgendes tun:
Schauen Sie sich die aufgelösten Abhängigkeiten mit an
kpm list
. Dies zeigt Ihnen die aufgelösten Versionen von Paketen, auf die Ihr Projekt verweist, und welche Abhängigkeit es ausgelöst hat. Wenn beispielsweise A -> B angezeigt wird, wird Folgendes angezeigt:Tatsächliche Ausgabe der KPM-Liste:
Auflisten von Abhängigkeiten für ClassLibrary39 (C: \ Benutzer \ davifowl \ Dokumente \ Visual Studio 14 \ Projekte \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)
* bedeutet direkte Abhängigkeit.
Wenn Sie ein funktionierendes visuelles Studio haben (das derzeit mit DNX bricht), können Sie sich den Referenzknoten ansehen. Es hat die gleichen Daten visuell dargestellt:
Schauen wir uns an, wie ein Abhängigkeitsfehler aussieht:
Hier ist die project.json
Newtonsoft.Json 8.0.0
existiert nicht. Das Ausführen der kpm-Wiederherstellung zeigt also Folgendes:Wenn Sie diagnostizieren, wann die Wiederherstellung möglicherweise fehlgeschlagen ist, sehen Sie sich die gestellten HTTP-Anforderungen an. Dort erfahren Sie, in welchen konfigurierten Paketquellen kpm gesucht hat. Beachten Sie, dass im obigen Bild eine
CACHE
Anforderung vorliegt. Dies ist das integrierte Caching, das auf dem Ressourcentyp (nupkg oder nuspec) basiert und über eine konfigurierbare TTL verfügt (siehekpm restore --help
). Wenn Siekpm
das Aufrufen der Remote-NuGet-Quellen erzwingen möchten , verwenden Sie das folgende--no-cache
Flag:Diese Fehler werden auch in Visual Studio im Protokollausgabefenster des Paketmanagers angezeigt:
Randnotiz!
Paketquellen
Ich werde beschreiben, wie NuGet.config jetzt funktioniert (was sich wahrscheinlich in Zukunft ändern wird). Standardmäßig haben Sie eine NuGet.config mit der standardmäßig global konfigurierten NuGet.org-Quelle in
%appdata%\NuGet\NuGet.Config
. Sie können diese globalen Quellen in Visual Studio oder mit dem NuGet-Befehlszeilentool verwalten. Sie sollten immer Ihre effektiven Quellen (die in der kpm-Ausgabe aufgeführten) betrachten, wenn Sie versuchen, Fehler zu diagnostizieren.Lesen Sie hier mehr über NuGet.config
Zurück zur Realität:
Wenn Abhängigkeiten nicht gelöst sind, erhalten Sie beim Ausführen der Anwendung Folgendes:
Die Laufzeit versucht grundsätzlich zu überprüfen, ob das gesamte Abhängigkeitsdiagramm aufgelöst ist, bevor versucht wird, es auszuführen. Wenn es vorgeschlagen wird, ausgeführt zu werden, liegt
kpm restore
es daran, dass die aufgelisteten Abhängigkeiten nicht gefunden werden können.Ein weiterer Grund, warum Sie diesen Fehler erhalten könnten, ist, wenn Sie die falsche dnx-Variante ausführen. Wenn Ihre Anwendung nur dnx451 angibt und Sie versuchen, den CoreCLR-dnx auszuführen, tritt möglicherweise ein ähnliches Problem auf. Achten Sie in der Fehlermeldung genau auf das Ziel-Framework:
Zum Laufen:
Wenn Sie versuchen zu laufen, sollten Sie sich daran erinnern, dass die mentale Zuordnung von clr zum Zielframework in Ihrem definiert ist
project.json
.Dies wird auch in Visual Studio unter dem Referenzknoten angezeigt:
Die als gelb markierten Knoten sind nicht aufgelöst.
Diese werden auch in der Fehlerliste angezeigt:
Gebäude
Diese Fehler treten auch beim Erstellen auf. Beim Erstellen über die Befehlszeile ist die Ausgabe sehr ausführlich und kann bei der Diagnose von Problemen äußerst nützlich sein:
Die Ausgabe zeigt alle Assemblys, die aus Paketen und Projektreferenzen an den Compiler übergeben wurden. Wenn Sie Build-Fehler erhalten, sollten Sie hier nachsehen, ob das von Ihnen verwendete Paket tatsächlich auf dieser Zielplattform funktioniert.
Hier ist ein Beispiel für ein Paket, das unter dnxcore50 nicht funktioniert:
Microsoft.Owin.Host.SystemWeb Version 3.0.0 enthält keine Assemblys, die auf dnxcore50 ausgeführt werden (siehe lib-Ordner des entpackten Pakets). Wenn wir rennen
kpm build
:Beachten Sie, dass dort "using Package Microsoft.Owin.Host.SystemWeb" steht, aber nicht "File:". Dies könnte der Grund für einen Buildfehler sein.
Hier endet mein Brain Dump
quelle
Ich weiß immer noch nicht ganz, was los war, aber ich habe jetzt eine Reihe von Schritten, um es zumindest einfacher zu machen, Dinge auszuprobieren:
~/.config/NuGet.config
Sie sicher, dass Sie die richtigen NuGet-Feeds verwendenAm Ende habe ich die folgende Befehlszeile verwendet, um verschiedene Optionen auf einigermaßen saubere Weise zu testen:
Es sieht so aus, als ob mein Problem wirklich auf die falschen Versionen der installierten Abhängigkeiten zurückzuführen ist. Eine Versionsnummer von
"1.0.0-beta4"
ist anscheinend ganz anders als"1.0.0-beta4-*"
. Beispielsweise hat dieKestrel
Abhängigkeit Version 1.0.0-beta4-11185 installiert, wenn sie nur als angegeben wurde1.0.0-beta4
, aber Version 1.0.0-beta4-11262 mit der-*
am Ende. Ich wolltebeta4
explizit angeben , um zu vermeiden, dass versehentlich ein Beta3-Build mit dem verwendet wirdDie folgende Projektkonfiguration funktioniert einwandfrei:
quelle
-*
immer die neueste Vorabversion erhalten, während Sie ohne diese Version die niedrigste Version erhalten, die alle Abhängigkeiten erfüllt (wie bei NuGet üblich). Dieser Test hat einige Beispiele."frameworks": {"dnx451": {}}
Hatte es für michdnxcore50
dnvm upgrade-self
, dies würde nicht auf die neueste Version aktualisieren. Das Ausführen der VS-Eingabeaufforderung als Administrator zeigte die dnvm-Version als anrc1...
, jedoch nicht als Administratorbeta5...
. Nach Ihrem Befehl wurden sowohl die Eingabeaufforderungen für Administratoren als auch für Nicht-Administratoren alsrc2...
(neueste) Version angezeigt .dnx451
oder nichtdnxcore50
, hat mir geholfen, dieses Thema ein bisschen besser zu verstehen: stackoverflow.com/a/30846048/89590 Kurze Antwort:dnx451
ist für Mono geeignet.Sie können ein env var gesetzt genannt ,
DNX_TRACE
um1
eine Tonne mehr diagnostische Informationen zu sehen. Seien Sie gewarnt, es gibt viel mehr Infos!quelle
Damit es funktioniert, habe ich mein
project.json
.. geändert . Es sieht jetzt so aus:Der Schlüssel schien der Framework-Bereich zu sein.
Auch die Umbenennung hat geändert, wie es
k web
funktioniert, so dass es jetztdnx . web
oderdnx . kestrel
Update - etwas mehr Infos
Seltsamerweise bekam ich, nachdem ich ohne definierte Frameworks gelaufen war, ein paar zusätzliche Dinge, als ich das tat
kpm restore
:.. dann lief es gut. Dann habe ich wieder in den Framework-Bereich gewechselt
.. und es hat immer noch funktioniert, während es vorher einen Fehler auslösen würde!
Sehr komisch!
(Ich renne
1.0.0-beta4-11257
)Weiteres Update
Ich fuhr eine neue Ubuntu - Instanz auf und bekam den gleichen Fehler wie Sie .. Mein Gedanke war , dass das Problem , indem sie es nur verursacht werden versuchen , Pakete von zu bekommen
nuget.org
und nichtmyget.org
(was die neueren Dinge hat) , so dass ich in einem fielNuGet.Config
in die Wurzel des Projekts .... das scheint es für mich behoben zu haben, indem ich die richtigen Versionen (nacheinander
kpm restore
) bekomme .quelle
In diesen Tagen
package.json
enden alle meine Versionen in"-rc2-*"
(Nur Ausnahmen, die ich bisher gesehen habe, sind die
Microsoft.Framework.Configuration
Pakete, die entweder"1.0.0-rc1-*"
oder sein müssen"1.0.0-*"
)In Bezug auf die "Versionszüge", die @davidfowl erwähnt, scheint zwischen Beta8 und RC2 eine Menge Schmerz verschwunden zu sein.
Ich hatte das meiste Glück
coreclr
mit diesen 2 NuGet-Feeds:Wenn ich zu tun haben Paket Probleme fehlen, 90% der Zeit ist es die gleichen Täter:
Die meiste Zeit kann ich diese umgehen, indem ich den Haupt-Feed von NuGet.org erzwinge:
Hier ist meine Arbeitskonfiguration.json:
quelle
Ich hatte auch Probleme mit der fehlenden Abhängigkeit beim Versuch, die Referenzen dnxcore50 und dnx451 zu beschwichtigen.
Wenn ich dieses Recht verstehe, werden "Abhängigkeiten": {} zwischen den Frameworks geteilt.
Dann sind "Abhängigkeiten": {} innerhalb der "Frameworks": spezifisch für dieses Framework.
dnxcore50 ist eine modulare Laufzeit (in sich geschlossen), die im Grunde alle Kernlaufzeiten enthält, die zum Ausführen eines Programms erforderlich sind, im Gegensatz zum klassischen .net-Framework, bei dem die Kernabhängigkeiten an anderer Stelle verstreut sind.
Nachdem dies gesagt war, wollte ich mich an den minimalen Ansatz halten, falls ich mich entschied, irgendwann auf Mac oder Linux zu hosten.
Update stieß auf seltsame Abhängigkeitsprobleme mit cshtml-Ansichten, ging erst einmal mit dnx451.
Das ist mein project.json
quelle