使用独立标志进行编译会在客户端代码中出现编译错误

Mar*_*ann 13 f# compiler-errors

我试图编译Zero29--standalone编译器标志.项目本身编译得很好,但我有一个单元测试项目,在Zero29项目中运行一些代码,即使它是一个可执行程序(.exe).

一切工作正常,而不--standalone编译标志.

但是,当我将--standalone编译标志添加到Zero29项目时,Zero29项目编译得很好,但是在单元测试项目中,编译器抱怨Zero29项目中定义的这个Discriminated Union :

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
Run Code Online (Sandbox Code Playgroud)

单元测试项目直接引用Zero29项目:

Zero29.UnitTests --references - > Zero29(其中--standalone被添加)

当我尝试编译整个解决方案时,Zero29项目将使用该--standalone标志进行编译,但随后编译Zero29.UnitTests失败.有几个错误,但它们都是一样的,所以这里有一个例子:

错误FS0039:未定义值或构造函数"Assign"

哪个指向此代码的第三行:

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

奇怪的是,虽然编译器Assign在这个代码片段的第三行抱怨,但它并没有抱怨使用Args.Parse,即使它在与ArgDiscriminated Union 相同的代码文件中定义.

为什么会这样做,我该如何解决这个问题?

(我试图在这里解决问题,但是我提供的链接指向GitHub上的实际代码文件,如果需要更多信息.)

kkm*_*kkm 6

使用--standaloneswitch 编译的库不能公开任何F#数据类型.例如,这是皮克林(Pickering)(2007年)中明确指出的.210.在您的情况下,受歧视的工会是这些被禁止的类型之一.文件是可执行文件的事实在这里没有任何改变:当你试图将它作为一个库时,它就变成了一个库.

还有多个报告(例如,这里这里),即使是编辑的图书馆--standalone,也引用其中一个来源,"时髦".可以肯定地说,这个开关的使用应该限于 -仅限单独的可执行文件(即使在单元测试下,他们也不能假装成库).


Pickering R.(2007).F#的基础.Apress出版.