2017-06-30 1 views
3

J'ai remarqué que l'ajout de paquets casse parfois mon code. Des fonctions comme Seq.replicate et List.take qui fonctionnaient ont des lignes rouges ondulées et le programme ne fonctionne plus. Voici une procédure détaillée qui devrait reproduire le problème (J'utilise VS Community Edition 2017):Pourquoi ajouter des paquets brise mon code?

1) Créer un projet.

2) Program.fs contient le code:

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    0 // return an integer exit code 

3) Ajouter deux lignes de code comme suit:

[<EntryPoint>] 
let main argv = 
    let repla = Seq.replicate 10 "A" 
    printfn "%A" (repla |> List.ofSeq |> List.take 5) 
    printfn "%A" argv 
    0 // return an integer exit code 

3) Hit Ctrl+F5, le programme se déroule sans aucun problème.

4) Cliquez avec le bouton droit sur References sur Solution Explorer. Cliquez sur Manage Nuget Packages.... 5) Cliquez sur Browse.

6) Recherchez Newtonsoft.Json et installez-le.

7) Appuyez sur Ctrl+F5, le programme fonctionne sans aucun problème. Les gravures de la console

["A"; "A"; "A"; "A"; "A"] 
[||] 

8) Procéder comme dans les étapes 4 à 6 et installer le paquet MathNet.Numerics utilisant Nuget.

9) Hit Ctrl+F5, le programme fonctionne sans aucun problème. Les gravures de la console

["A"; "A"; "A"; "A"; "A"] [||]

10) Procéder comme dans les étapes 4 à 6 et installer le paquet MathNet.Numerics.FSharp utilisant Nuget. 10) Cliquez sur l'onglet Program.fs Les lignes rouges effrayantes redoutées sont apparues sous Seq.replicate and List.take`.

12) Appuyez sur Ctrl+F5. Une boîte de dialogue apparaît avec le message suivant:

There were build errors. Would you like to continue and run the last successful build? 

Questions:

a) Qu'est-ce qui se passe exactement?

b) S'agit-il d'un cas isolé lié à un problème dans MathNet.Numerics.FSharp ou à la combinaison spécifique de packages installés ou à l'ordre dans lequel ils ont été installés? Ou est-ce un problème commun?

c) Est-il possible d'éviter ce problème lors de l'utilisation de Nuget?

d) Si non, est-il possible d'éviter ce problème en installant par d'autres moyens (pas Nuget)?

+1

Quelles sont les versions des paquets installez-vous? – mydogisbox

+1

(1) Quelle est l'erreur sous le squiggly rouge? (2) Avez-vous remarqué que l'installation de 'MathNet.Numerics.FSharp' a provoqué l'installation de tous les paquets _other_ (en raison de dépendances transitives)? –

+0

@FyodorSoikin - L'erreur sous le rouge squiggly est 'La valeur, le constructeur, l'espace de noms ou le type 'répliquer' n'est pas défini'. Lorsque 'MathNet.Numerics.FSharp' est installé, il installe' FSharp.Core.3.1.2.5'. – Soldalma

Répondre

3

Eh bien, je pense que les préoccupations du PO sont quelque peu valables. Je déconseillerais l'édition manuelle du fichier fsproj. Et aussi les commentaires sont très valables aussi, Paket est un excellent outil qui peut simplifier la gestion des dépendances à la fois dans VS et Code. Donc, voici une réponse très simple, en deux parties, où a) vous pouvez réellement faire fonctionner votre solution en utilisant nugget et sans modifier manuellement le fichier projet, et b) obtenir une introduction rapide à l'utilisation de paket sur VS.

Ce problème est dû au fait que certains téléchargements de packages et certaines anciennes dépendances qui perturbent d'autres codes se produisent de temps en temps et sont probablement dus à une stratégie consistant à s'appuyer sur la version minimale viable. Votre problème est similaire à celui-ci: Q: Why can't I get suave to work.

est ici la solution la plus simple en utilisant seulement pépite:

  1. Ouvrir une nouvelle solution avec un projet de console FSharp
  2. A ce stade, votre Fsharp.Core à VS2017 sera 4.1:

enter image description here

  1. Maintenant, ajoutez Mathnet.Numerics.Fsharp via le nugget:

enter image description here

Maintenant, très malheureusement, vous avez été rétrogradé à F # 3.1

  1. Ce n'est pas bon, donc juste obtenir Fsharp.Core par pépite aussi bien!

enter image description here

  1. Et le tour est joué, vous êtes de retour à une solution de travail sans avoir besoin de modifier FSPROJ. Fondamentalement, tout ce que vous avez à faire est d'ajouter le paquet Fsharp.Core. Vous auriez pu également changé l'option .NET Framework dans les propriétés et le déplacer vers 4.7 avec .NET 4.1 FSharp:

enter image description here

Maintenant, pour la partie 2 de la réponse avec Paket (BTW, le plugin Paket juste J'ai été mis à jour et j'ai testé et ça marche bien). Vous pouvez essentiellement l'utiliser pour remplacer nugget ou directement éditer les fichiers. Vous avez réellement besoin de travailler avec deux fichiers, paket.dependencies dans la racine de la solution et paket.references dans la racine du projet. Paket.lock sera généré. Voici un processus en deux étapes pour commencer.Prenez le projet que vous venez de faire ci-dessus et dans le menu Outils dans VS sélectionnez Paket Dependencies Manager, faire Initialize Paket, puis faire Convert From Nuget:

enter image description here

Avec cela, vous pouvez continuer à gérer vos dépendances avec paket NuGet ou de l'utilisation si vous le souhaitez. Ensuite, je vais ajouter Newtonsoft.JSON aux références. Double-cliquez sur le fichier paket.dependencies et ajoutez la ligne suivante: nuget Newtonsoft.Json 10.0.3 restriction: >= net452, vous ne réellement besoin Newtonsoft.Json là-bas, mais nous ne voulons pas télécharger l'ensemble interweb appelé .NetCore. Ajoutez également cette ligne à paket.references (vous pouvez simplement cliquer dessus dans l'explorateur de projet): Newtonsoft.Json. Et la course Outils | Paket | Installation:

Paket.dependencies:

enter image description here

Paket.references:

enter image description here

And Run Paket Installation:

enter image description here

Et vous aurez installé Newtonsoft.JSON. Habituellement, vous n'avez pas besoin de spécifier une version de la restriction de l'infrastructure, mais elle contient un paquet de pré-version que vous ne voulez peut-être pas, et je suppose que vous n'avez pas besoin des dépendances .netcore.

Vous pouvez réellement faire un clic droit et essayer d'installer ce package à partir des références Ajouter le menu Package, mais vous croiserez des erreurs de dépendance.

enter image description here

enter image description here

+1

Merci beaucoup. Superbe. J'ai regardé attentivement la première partie de votre réponse et bien sûr tout fonctionne comme vous l'avez dit. Mais je suis un peu confus à propos de la dernière phrase: "Vous auriez pu aussi changer l'option .NET Framework dans les propriétés et la déplacer vers .NET 4.7 avec Fsharp 4.1" J'ai ouvert les propriétés du projet et vu une page comme celle de votre message . Mais à la fois dans mon écran et dans la page que vous avez posté il avait ".NET Framework 4.5.2" et vous avez mentionné ".NET 4.7". S'il vous plaît ne me dérange pas si c'est une question idiote. J'apprends. – Soldalma

+1

Sur la partie 2 de la réponse, je comprends que Paket est à bien des égards meilleur que l'excellent Nuget. Mais j'ai dû réinstaller VS trois fois après avoir eu des problèmes avec Paket car je n'avais pas les connaissances nécessaires pour faire face aux problèmes auxquels je faisais face. Je voudrais essayer ce que vous suggérez mais il serait plus facile s'il y avait un moyen de désinstaller Paket sans devoir désinstaller et réinstaller VS au cas où les choses ne fonctionnent pas comme prévu. Est-ce possible? Puis-je utiliser Git/Bitbucket (c'est ce que j'utilise) pour le faire? – Soldalma

+1

Vous n'avez pas besoin d'utiliser un paquet si vous ne le souhaitez pas. c'est-à-dire que ce n'est pas un besoin. paket est juste un exe, vous pouvez supprimer le dossier .paket à tout moment. Vous pouvez également désinstaller le complément VS paket dans le menu Outils dans VS. – s952163

6

MathNet.Numerics.FSharp a une dépendance à FSharp.Core.3.1.2.5 qui remplace la version actuelle de FSharp.Core que vous utilisez. Être assez vieux 3.1.2.5 manque de nombreuses fonctions.

Cela se produit également avec d'autres bibliothèques populaires F# telles que FsCheck. Je change habituellement la référence à la nouvelle version de FSharp.Core car cela devrait être rétrocompatible.

Pour ce faire, je décharge le projet F# et mettre à jour la référence FSharp.Core dans le fichier de projet:

<Reference Include="FSharp.Core"> 
    <Name>FSharp.Core</Name> 
    <AssemblyName>FSharp.Core.dll</AssemblyName> 
    <HintPath>$(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll</HintPath> 
</Reference> 

Je recharger le projet.

Comme il s'agit d'une procédure plutôt maladroite, nous espérons que les utilisateurs les plus perspicaces publieront une meilleure solution.

+1

Clunky ou pas cela a fonctionné. Merci beaucoup. Y at-il un livre/PDF/lien qui enseigne à un débutant comment traiter les fichiers de projet? – Soldalma

+2

@Soldalma use paket ;-) http://fsprojects.github.io/Paket/ Paket vérifie tout cela pour vous et vous permet d'être explicite sur les dépendances. – mydogisbox

+1

@mydogisbox - Pour moi ce n'est pas le cas. J'ai essayé Paket et j'ai dû réinstaller VS Studio 2017 pour m'en débarrasser. Même type de problèmes, mais pire. Peut-être que c'est parce que je ne sais pas comment l'utiliser. Les messages d'erreur émis par Paket étaient incompréhensibles pour moi. Je n'ai pas pu trouver d'instructions pour un débutant qui sait peu de choses sur les projets, la construction, etc. Aussi, en utilisant Paket on doit faire face à trois fichiers, avec Nuget c'est seulement un. – Soldalma