13 Stimmen

Kompilieren mit dem Standalone-Flag führt zu Kompilierungsfehlern im Client-Code.

Ich versuche, Zero29 mit dem --standalone Compiler-Flag zu kompilieren. Das Projekt selbst kompiliert gut, aber ich habe ein Unittest-Projekt, das einige Code in dem Zero29-Projekt testet, auch wenn es ein ausführbares Programm (.exe) ist.

Alles funktioniert gut ohne das --standalone Kompilierungsflag.

Jedoch, wenn ich das --standalone Kompilierungsflag zum Zero29 Projekt hinzufüge, kompiliert das Zero29 Projekt gut, aber im Unittest-Projekt beschwert sich der Compiler über diese diskriminierte Union die im Zero29 Projekt definiert ist:

namespace Ploeh.ZeroToNine

open System
open Ploeh.ZeroToNine.Versioning

type Arg =
    | Assign of Version
    | AssignRank of Rank * int
    | Increment of Rank
    | ListVersions
    | ShowHelp
    | Unknown of string list

Das Unittest-Projekt referenziert direkt das Zero29 Projekt:

Zero29.UnitTests --references--> Zero29 (wo --standalone hinzugefügt ist)

Wenn ich versuche, die gesamte Lösung zu kompilieren, kompiliert das Zero29 Projekt mit dem --standalone Flag, aber dann schlägt die Kompilierung von Zero29.UnitTests fehl. Es gibt mehrere Fehler, aber sie sind alle gleich, also hier ist ein einzelnes Beispiel:

Fehler FS0039: Der Wert oder Konstruktor 'Assign' ist nicht definiert

Was auf die dritte Zeile von diesen Code zeigt:

let ParseAssignVersionReturnsCorrectResult(version : string) =
    let actual = [| "-a"; version |] |> Args.Parse
    verify <@ [Assign(Version version)] = (actual |> Seq.toList) @>

Das Seltsame ist, dass während der Compiler sich über Assign in der dritten Zeile dieses Codeausschnitts beschwert, es sich nicht über die Verwendung von Args.Parsegleichen Code-Datei wie die Arg diskriminierte Union definiert ist.

Warum tut er das und wie kann ich dieses Problem lösen?

(Ich habe versucht, das Problem hier zusammenzufassen, aber die von mir bereitgestellten Links verweisen auf die tatsächlichen Code-Dateien auf GitHub, falls mehr Informationen benötigt werden.)

6voto

kkm Punkte 4767

Bibliotheken, die mit dem --standalone Schalter kompiliert wurden, können keine F# Datentypen freigeben. Dies wird zum einen ausdrücklich in Pickering (2007), S. 210 festgelegt. In Ihrem Fall ist eine diskriminierte Union einer dieser verbotenen Typen. Die Tatsache, dass die Datei eine ausführbare Datei ist, ändert hier nichts: Sie wird zu einer Bibliothek, sobald Sie versuchen, sie als eine zu verwenden.

Es gab auch mehrere Berichte (zum Beispiel hier und hier), dass selbst Bibliotheken, die mit --standalone kompiliert wurden, sich, um eine dieser Quellen zu zitieren, "komisch" verhalten. Es wäre sicher zu sagen, dass die Verwendung dieses Schalters vielleicht auf eigenständige ausführbare Dateien beschränkt sein sollte (und sie können nicht vorgeben, eine Bibliothek zu sein, selbst wenn sie unter Unittests stehen).


Pickering R. (2007). Grundlagen von F#. Apress.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X