2017-06-30 7 views
3

Ich habe festgestellt, dass das Hinzufügen von Paketen manchmal meinen Code zerstört. Funktionen wie und List.take, die funktionierten, bekommen rote, verschnörkelte Linien und das Programm läuft nicht mehr. Hier ist eine detaillierte Prozedur, die das Problem replizieren sollte (ich verwende VS Community Edition 2017):Warum wird mein Code durch das Hinzufügen einiger Pakete beschädigt?

1) Erstellen Sie ein Projekt.

2) Program.fs den Code enthält:

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

3) zwei Codezeilen hinzufügen wie folgt:

[<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, läuft das Programm ohne Probleme.

4) Klicken Sie mit der rechten Maustaste auf auf der Solution Explorer. Klicken Sie auf Manage Nuget Packages....

5) Klicken Sie auf Browse.

6) Suchen Sie nach Newtonsoft.Json und installieren Sie es.

7) Hit Ctrl+F5, das Programm läuft ohne Probleme. Die Konsole druckt

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

8), gehen Sie wie in den Schritten 4 bis 6 und Installationspaket MathNet.NumericsNuget verwenden.

9) Hit Ctrl+F5, das Programm läuft ohne Probleme. Die Konsole druckt

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

10), gehen Sie wie in den Schritten 4 bis 6 und Installationspaket MathNet.Numerics.FSharpNuget verwenden.

11) Klicken Sie auf die Registerkarte Program.fs. Die gefürchteten roten Schlangenlinien erschienen unter Seq.replicate and List.take`.

12) Hit Ctrl+F5. Nun erscheint ein Dialog mit der folgenden Meldung auf:

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

Fragen:

a) Was genau ist passiert?

b) Ist dies ein Einzelfall, der auf ein Problem in MathNet.Numerics.FSharp oder die spezifische Kombination von installierten Paketen oder die Reihenfolge, in der sie installiert wurden, zurückzuführen ist? Oder ist das ein häufiges Problem?

c) Kann dieses Problem während der Verwendung von Nuget vermieden werden?

d) Wenn nicht, ist es möglich, dieses Problem durch Installation auf andere Weise (nicht durch Nuget) zu vermeiden?

+1

Welche Versionen der Pakete installieren Sie? – mydogisbox

+1

(1) Was ist der Fehler unter dem roten Schnörkel? (2) Ist Ihnen aufgefallen, dass die Installation von 'MathNet.Numerics.FSharp' die Installation von _other_ Paketen (aufgrund transitiver Abhängigkeiten) verursacht hat? –

+0

@FyodorSoikin - Der Fehler unter dem roten Squiggly ist 'Der Wert, Konstruktor, Namespace oder Typ 'Replikat' ist nicht definiert '. Wenn "MathNet.Numerics.FSharp" installiert ist, wird auch 'FSharp.Core.3.1.2.5' installiert. – Soldalma

Antwort

3

Nun, ich denke, die Bedenken des OP sind etwas berechtigt. Ich würde es abraten, die fsproj-Datei manuell zu bearbeiten. Und auch die Kommentare sind sehr gut, Paket ist ein großartiges Werkzeug, das die Abhängigkeitsverwaltung sowohl in VS als auch in Code vereinfachen kann. Also hier ist eine sehr einfache, zweiteilige Antwort, wo a) Sie können Ihre Lösung tatsächlich arbeiten mit Nugget und ohne Handbearbeitung der Projektdatei, und b) erhalten Sie eine kurze Einführung in die Verwendung von Paket auf VS.

Dieses Problem, bei dem einige Paketdownloads und alte Abhängigkeiten, die anderen Code durcheinander bringen, hin und wieder auftreten, liegt wahrscheinlich an der Strategie, sich auf die mindestens lebensfähige Version zu verlassen. Ihr Problem ähnelt diesem Thema Q: Why can't I get suave to work.

Hier ist die einfachste Lösung mit nur Nugget:

  1. Öffnen Sie eine neue Lösung mit einem FSharp Konsolenprojekt
  2. An dieser Stelle Ihre Fsharp.Core in VS2017 4.1 sein wird:

enter image description here

  1. Fügen Sie jetzt Mathnet.Numerics.Fsharp über das Nugget:
  2. hinzu sowie

enter image description here

nun sehr leider bekam man zu F herabgestuft # 3.1

  1. Das ist nicht gut, so dass man nur Fsharp.Core über Nugget!

enter image description here

  1. Und voila, du bist zurück in eine Arbeitslösung ohne fsproj bearbeiten zu müssen. Sie müssen lediglich das Fsharp.Core-Paket hinzufügen. Sie könnten sie geändert haben auch die .NET Framework-Option in Eigenschaften und es zu .NET 4.7 mit FSharp 4.1 bewegen:

enter image description here

Jetzt für Teil 2 der Antwort mit Paket (btw, die Paket-Plugin nur wurde aktualisiert und ich testete und es funktioniert gut). Sie können es im Wesentlichen als Ersatz für Nugget verwenden oder die Dateien direkt bearbeiten. Sie müssen tatsächlich mit zwei Dateien arbeiten: paket.dependencies im Lösungsstammverzeichnis und paket.references im Projektstammverzeichnis. Paket.lock wird generiert. Hier ist ein zweistufiger Prozess, um loszulegen.Nehmen Sie das Projekt, das Sie gerade oben und aus dem Menü Extras in VS gemacht Paket Dependencies Manager wählen, tun Initialize Paket, dann Convert From Nuget tun:

enter image description here

Mit diesem halten Sie können Ihre Abhängigkeiten mit nuget oder Verwendung paket verwalten, wenn Sie mögen. Als nächstes werde ich Newtonsoft.JSON zu den Referenzen hinzufügen. Doppelklicken Sie auf die paket.dependencies Datei und fügen Sie die folgende Zeile hinzu: nuget Newtonsoft.Json 10.0.3 restriction: >= net452, Sie brauchen eigentlich nur Newtonsoft.Json, aber wir wollen nicht das gesamte Interweb namens .NetCore herunterladen. Fügen Sie diese Zeile ebenfalls zu paket.references hinzu (Sie können einfach im Projekt-Explorer darauf klicken): Newtonsoft.Json. Und die Ausführung Tools | Paket | Installieren:

Paket.dependencies:

enter image description here

Paket.references:

enter image description here

And Run Paket installieren:

enter image description here

Und Sie werden Newtonsoft.JSON installiert haben. In der Regel müssen Sie keine Version der Framework-Einschränkung angeben, jedoch enthält sie ein Pre-Release-Paket, das Sie möglicherweise nicht möchten, und ich nehme an, dass Sie die .netcore-Abhängigkeiten nicht benötigen.

Sie können tatsächlich mit der rechten Maustaste klicken und versuchen, dieses Paket aus den Referenzen Paket hinzufügen-Menü zu installieren, aber Sie stoßen auf Abhängigkeit Fehler.

enter image description here

enter image description here

+1

Vielen Dank. Hervorragend. Ich habe mir den ersten Teil Ihrer Antwort genau angesehen und natürlich funktioniert alles wie Sie gesagt haben. Aber ich bin etwas verwirrt über den letzten Satz: "Sie könnten auch die .NET Framework-Option in Eigenschaften geändert haben und sie mit Fsharp 4.1 nach .NET 4.7 verschieben." Ich öffnete die Projekteigenschaften und sah eine Seite wie die in Ihrem Beitrag . Aber sowohl auf meinem Bildschirm als auch auf der von Ihnen geposteten Seite war ".NET Framework 4.5.2" und Sie haben ".NET 4.7" erwähnt. Bitte, macht mir nichts aus, wenn das eine dumme Frage ist. Ich lerne. – Soldalma

+1

Auf Teil 2 der Antwort verstehe ich, dass Paket in vielerlei Hinsicht besser ist als das bereits ausgezeichnete Nuget. Aber ich musste VS dreimal neu installieren, nachdem ich Probleme mit Paket bekommen hatte, da ich nicht das Wissen hatte, mit den Problemen umzugehen, mit denen ich konfrontiert war. Ich würde gerne versuchen, was Sie vorschlagen, aber es wäre einfacher, wenn es eine Möglichkeit gäbe, Paket zu deinstallieren, ohne VS neu installieren und neu installieren zu müssen, falls die Dinge nicht wie erwartet funktionieren. Ist das möglich? Könnte ich Git/Bitbucket (das ist was ich verwende) verwenden? – Soldalma

+1

Sie brauchen kein Paket, wenn Sie nicht wollen. Das ist keine Notwendigkeit. Paket ist nur eine exe, Sie können den .paket Ordner jederzeit löschen. Sie können das VS Paket Add-In auch in dem Menü Extras in VS deinstallieren. – s952163

6

MathNet.Numerics.FSharp hat eine Abhängigkeit zu FSharp.Core.3.1.2.5, die die aktuelle Version FSharp.Core ersetzt, die Sie verwenden. Ganz alt zu sein 3.1.2.5 fehlt viele Funktionen.

Dies geschieht mit anderen beliebten F# Bibliotheken wie FsCheck sowie. Normalerweise ändere ich die Referenz auf die neueste Version von FSharp.Core, da diese rückwärtskompatibel sein sollte.

Dazu ich das F# Projekt und aktualisieren Sie die FSharp.Core Referenz in der Projektdatei zu entladen:

<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> 

Dann lade ich das Projekt.

Da dies eine ziemlich klobige Prozedur ist, werden hoffentlich mehr aufschlussreiche Benutzer eine bessere Lösung veröffentlichen.

+1

Clunky oder nicht, es hat funktioniert. Danke vielmals. Gibt es ein Buch/PDF/Link, das einem Anfänger den Umgang mit Projektdateien vermittelt? – Soldalma

+2

@Soldalma Paket verwenden ;-) http://fsprojects.github.io/Paket/ Paket prüft all diese Dinge für Sie und erlaubt Ihnen, explizit über Abhängigkeiten zu sprechen. – mydogisbox

+1

@mydogisbox - Für mich ist das nicht der richtige Weg. Ich habe versucht Paket und musste VS Studio 2017 neu installieren, um es loszuwerden. Gleiche Art von Problemen, aber schlimmer. Vielleicht liegt es daran, dass ich nicht weiß, wie ich es benutzen soll. Die Fehlermeldungen von Paket waren für mich unverständlich. Ich konnte keine Anleitung für einen Anfänger finden, der wenig über Projekte, Build usw. weiß. Auch mit Paket muss man sich mit drei Dateien beschäftigen, mit Nuget ist es nur einer. – Soldalma

Verwandte Themen