J'essaie d'exécuter une version modifiée de l' exemple HelloWeb pour ASP.NET vNext sur DNX à l'aide de Kestrel. Je comprends que cela est très bien sur le bord des saignements, mais j'espère que l'équipe ASP.NET serait au moins maintenir le fonctionnement de l' application web la plus simple possible :)
Environnement:
- Linux (Ubuntu, à peu près)
- Mono 3.12.1
- DNX 1.0.0-beta4-11257 (j'ai aussi 11249 disponible)
Code "application Web", dans Startup.cs
:
using Microsoft.AspNet.Builder;
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseWelcomePage();
}
}
Configuration du projet, dans 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
semble fonctionner correctement.
Quand j'essaye de courir, cependant, j'obtiens une exception suggérant que Microsoft.Framework.Runtime.IApplicationEnvironment
ne peut pas être trouvée. Ligne de commande et erreur (quelque peu reformatée)
.../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
Bien que mon besoin le plus urgent soit évidemment de résoudre ce problème, j'apprécierais également des conseils sur la façon de procéder pour diagnostiquer ce qui ne va pas afin de pouvoir résoudre moi-même des problèmes similaires à l'avenir. (Cela rendra également cette question plus utile aux autres.)
J'ai trouvé Microsoft.Framework.Runtime.IApplicationEnvironment
dans la Microsoft.Framework.Runtime.Interfaces
source de l' assembly , et cela ne semble pas avoir changé récemment. On ne sait pas pourquoi l'exception montre le nom comme s'il s'agissait d'un assembly entier en soi, plutôt que simplement d'une interface dans un autre assembly. Je suppose que cela peut être dû à des interfaces neutres pour l' assemblage , mais ce n'est pas clair d'après l'erreur. ( [AssemblyNeutral]
est mort, donc ce n'est pas ça ... )
la source
Réponses:
Bonne question. Pour votre problème spécifique, il semble que vos dépendances résolues ne correspondent pas. Lorsque de telles choses se produisent, c'est probablement parce que vous exécutez votre application sur un dnx incompatible. Nous faisons toujours de très gros changements de rupture, donc si jamais vous voyez une méthode manquante de type manquant, il y a de fortes chances que vous ayez fini par exécuter des
betaX
packages etbetaY
dnx ou vice versa.Plus précisément, les interfaces neutres d'assemblage ont été supprimées dans la version bêta4, mais il semble que l'application que vous exécutez les utilise toujours.
Nous avons prévu de faire en sorte que les packages puissent marquer le dnx minimum dont ils ont besoin pour s'exécuter pour rendre le message d'erreur plus clair. De plus, avec le temps, les changements décisifs disparaîtront.
En général, cependant, j'ai l'impression qu'il est temps d'écrire un guide sur la façon de diagnostiquer des problèmes comme celui-ci lors de l'utilisation du dnx (car il est assez différent de .NET existant).
Les dépendances dans lesquelles vous insérez
project.json
sont uniquement de niveau supérieur. Les versions sont également toujours des minimums (c'est comme un package NuGet). Cela signifie que lorsque vous spécifiez,Foo 1.0.0-beta4
vous spécifiez vraimentFoo >= 1.0.0-beta4
. Cela signifie que si vous demandezMVC 0.0.1
et que les versions minimales de votre flux configuré sontMVC 3.0.0
, vous obtiendrez celle-là. Nous ne flotterons JAMAIS votre version à moins que vous ne le spécifiiez. Si vous demandez 1.0.0 et qu'il existe, vous obtiendrez 1.0.0 même si des versions plus récentes existent. La spécification de versions vides est TOUJOURS mauvaise et ne sera pas autorisée dans les versions ultérieures.Nous présentons une nouvelle fonctionnalité à nuget appelée versions flottantes. Aujourd'hui, cela ne fonctionne que sur la balise d'avant-première, mais dans la prochaine version, cela fonctionnera sur plus de parties de la version. Ceci est similaire à la syntaxe npm et gem pour la spécification des plages de versions dans le fichier de spécification du package.
1.0.0-*
- Signifie me donner la version LA PLUS ÉLEVÉE correspondant au préfixe (selon les règles de contrôle de version sémantique ) OU s'il n'y a pas de version correspondant à ce préfixe, utilisez le comportement normal et obtenez-moi la version LA PLUS BASSE> = la version spécifiée.Lorsque vous exécutez la restauration dans les dernières versions, un fichier appelé
project.lock.json
. Ce fichier aura la fermeture transitive des dépendances pour tous les frameworks cibles définis dansproject.json
.Quand quelque chose comme ça échoue, vous pouvez faire ce qui suit:
Jetez un œil aux dépendances résolues à l'aide de
kpm list
. Cela vous montrera les versions résolues des packages référencés par votre projet et quelle dépendance l'a entraîné. Par exemple, si A -> B, cela affichera:Sortie réelle de la liste KPM:
Liste des dépendances pour ClassLibrary39 (C: \ Users \ davifowl \ Documents \ Visual Studio 14 \ Projects \ ClassLibrary39 \ src \ ClassLibrary39 \ project.json)
* signifie dépendance directe.
Si vous avez un studio visuel fonctionnel (qui rompt avec DNX pour le moment), vous pouvez regarder le nœud des références. Il a les mêmes données représentées visuellement:
Regardons à quoi ressemble un échec de dépendance:
Voici le project.json
Newtonsoft.Json 8.0.0
n'existe pas. Ainsi, l'exécution de la restauration kpm montre ce qui suit:Lors du diagnostic de l'échec de la restauration, examinez les requêtes HTTP effectuées, elles vous indiquent les sources de package configurées que kpm a recherchées. Remarquez dans l'image ci-dessus, il y a une
CACHE
requête. Il s'agit de la mise en cache intégrée basée sur le type de ressource (nupkg ou nuspec) et a un TTL configurable (regardezkpm restore --help
). Si vous souhaitez forcerkpm
à atteindre les sources NuGet distantes, utilisez l'--no-cache
indicateur:Ces erreurs apparaissent également dans Visual Studio dans la fenêtre de sortie du journal du gestionnaire de packages:
Note secondaire!
Sources de paquet
Je décrirai la façon dont NuGet.config fonctionne actuellement (ce qui changera probablement à l'avenir). Par défaut, vous avez un NuGet.config avec la source NuGet.org par défaut configurée globalement dans
%appdata%\NuGet\NuGet.Config
. Vous pouvez gérer ces sources globales dans Visual Studio ou avec l'outil de ligne de commande NuGet. Vous devriez toujours regarder vos sources efficaces (celles répertoriées dans la sortie de kpm) lorsque vous essayez de diagnostiquer des échecs.En savoir plus sur NuGet.config ici
Retour à la réalité:
Lorsque les dépendances ne sont pas résolues, l'exécution de l'application vous donnera ceci:
Le moteur d'exécution essaie essentiellement de valider que l'ensemble du graphe de dépendances est résolu avant d'essayer de s'exécuter. S'il suggère de courir
kpm restore
c'est parce qu'il ne trouve pas les dépendances répertoriées.Une autre raison pour laquelle vous pourriez obtenir cette erreur est si vous exécutez la mauvaise saveur dnx. Si votre application ne spécifie que dnx451 et que vous essayez d'exécuter le CoreCLR dnx, vous pouvez rencontrer un problème similaire. Faites très attention au cadre cible dans le message d'erreur:
Pour courrir:
Lorsque vous essayez de courir, vous devez vous rappeler que le mappage mental de CLR au cadre cible défini dans votre
project.json
.Cela apparaît également dans Visual Studio sous le nœud de références:
Les nœuds marqués en jaune ne sont pas résolus.
Ceux-ci apparaissent également dans la liste des erreurs:
Bâtiment
Ces erreurs apparaissent également lors de la construction. Lors de la construction à partir de la ligne de commande, la sortie est très détaillée et peut être extrêmement utile lors du diagnostic des problèmes:
La sortie affiche tous les assemblys passés dans le compilateur à partir de packages et de références de projet. Lorsque vous commencez à avoir des échecs de compilation, il est utile de regarder ici pour vous assurer que le package que vous utilisez fonctionne réellement sur cette plate-forme cible.
Voici un exemple de package qui ne fonctionne pas sur dnxcore50:
Microsoft.Owin.Host.SystemWeb version 3.0.0 n'a pas d'assemblys qui s'exécutent sur dnxcore50 (jetez un œil au dossier lib du package décompressé). Quand nous courons
kpm build
:Notez qu'il dit "en utilisant le package Microsoft.Owin.Host.SystemWeb" mais il n'y a pas de "Fichier:". Cela pourrait être la raison d'un échec de construction.
Ici se termine mon vidage cérébral
la source
Je ne sais toujours pas tout à fait ce qui n'allait pas, mais j'ai maintenant une série d'étapes pour au moins faciliter les choses:
~/.config/NuGet.config
que vous utilisez les bons flux NuGetJ'ai fini par utiliser la ligne de commande suivante pour tester diverses options de manière raisonnablement propre:
Il semble que mon problème soit vraiment dû aux mauvaises versions des dépendances installées. Un numéro de version de
"1.0.0-beta4"
est apparemment assez différent de"1.0.0-beta4-*"
. Par exemple, laKestrel
dépendance a installé la version 1.0.0-beta4-11185 lorsqu'elle est juste spécifiée comme1.0.0-beta4
, mais la version 1.0.0-beta4-11262 avec le-*
à la fin. Je voulais spécifierbeta4
explicitement pour éviter d'utiliser accidentellement une version beta3 avec leLa configuration de projet suivante fonctionne correctement:
la source
-*
vous donne toujours la dernière version préliminaire, tandis que sans elle, vous obtenez la version la plus basse qui satisfait toutes les dépendances (comme d'habitude avec NuGet). Ce test a quelques exemples."frameworks": {"dnx451": {}}
l'avait-il réparé pour moi, pas besoin dednxcore50
dnvm upgrade-self
, cela ne passerait pas à la dernière version. L'exécution de l'invite de commande VS en tant qu'administrateur montrait la version de dnvm commerc1...
, mais lorsqu'elle n'était pas en tant qu'administrateur, elle l'étaitbeta5...
. Après votre commande, les invites de commande admin et non admin sont affichées comme larc2...
(dernière) version.dnx451
oudnxcore50
cette réponse m'a aidé à comprendre un peu plus ce sujet: stackoverflow.com/a/30846048/89590 Réponse courte:dnx451
convient pour mono.Vous pouvez définir une variable d'environnement nommée
DNX_TRACE
à1
pour afficher une TON plus d'informations de diagnostic. Attention, c'est beaucoup plus d'infos!la source
Pour le faire fonctionner, j'ai modifié mon
project.json
.. il ressemble maintenant à:La clé semblait être la section des cadres.
De plus , le changement de nom changé la façon dont
k web
fonctionne de telle sorte que son entreprisednx . web
oudnx . kestrel
Mise à jour - un peu plus d'informations
Curieusement, après avoir fonctionné sans framework défini, il est allé et a obtenu un tas de choses supplémentaires quand je l'ai fait
kpm restore
:.. alors ça a bien fonctionné. Puis je suis retourné dans la section framework
.. et cela fonctionnait toujours, alors qu'avant, cela provoquait une erreur!
Très étrange!
(Je cours
1.0.0-beta4-11257
)Mise à jour supplémentaire
J'ai créé une nouvelle instance d'Ubuntu et j'ai eu la même erreur que vous .. Je pensais que le problème pouvait être causé par le fait d'essayer uniquement d'obtenir des packages de
nuget.org
et nonmyget.org
(ce qui a les nouvelles choses), alors j'ai laissé tomber unNuGet.Config
dans le racine du projet... cela semble l'avoir résolu pour moi en obtenant les versions correctes (après l'autre
kpm restore
).la source
Ces jours-ci, toutes mes
package.json
versions se terminent par"-rc2-*"
(Les seules exceptions que j'ai vues jusqu'à présent sont les
Microsoft.Framework.Configuration
packages, qui doivent être soit"1.0.0-rc1-*"
ou"1.0.0-*"
)Concernant les "trains de versions" que @davidfowl mentionne, il semble que BEAUCOUP de douleur ait disparu entre beta8 et rc2.
J'ai eu le plus de chance
coreclr
avec ces 2 flux NuGet:Quand je fais ont des problèmes de manque paquet, 90% du temps , ce sont ces mêmes coupables:
La plupart du temps, je peux contourner ces problèmes en forçant le flux principal de NuGet.org:
Voici mon config.json de travail:
la source
J'avais également des problèmes de dépendance en essayant d'apaiser les références dnxcore50 et dnx451.
Si je comprends bien ce droit, les "dépendances": {} sont partagées entre les frameworks.
Ensuite, les "dépendances": {} dans les "frameworks": sont spécifiques à ce framework.
dnxcore50 est un runtime modulaire (autonome) donc il contient essentiellement tous les runtimes de base nécessaires pour exécuter un programme contrairement au framework .net classique où vous avez des dépendances de base éparpillées ailleurs.
Cela dit, je voulais m'en tenir à l'approche minimale au cas où je décidais d'héberger sur mac ou linux à un moment donné.
Mettez à jour Ran dans des problèmes de dépendance étranges avec les vues cshtml, vient de passer avec dnx451 pour le moment.
Ceci est mon projet.json
la source