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

时间:2014-03-23 16:35:55

标签: f# compiler-errors

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

一切正常没有 --standalone编译标记。

但是,当我将--standalone编译标志添加到Zero29项目时,Zero29项目编译得很好,但是在单元测试项目中,编译器抱怨这个被区分的联盟defined in the Zero29 project

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

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

  

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

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

  

错误FS0039:值或构造函数'分配'未定义

指向this code的第三行:

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

奇怪的是,虽然编译器在此代码段的第三行中抱怨Assign,但没有抱怨使用Args.Parse ,即使它是defined in the same code file as the Arg Discriminated Union

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

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

1 个答案:

答案 0 :(得分:5)

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

还有多个报告(例如,herehere),即使是使用--standalone编译的库,也引用其中一个来源,“时髦”。它会是可以肯定地说,这个开关的使用应该仅限于独立的可执行文件(即使在单元测试下也不能伪装成库)。


Pickering R.(2007)。 F#的基础。 A按