【问题标题】:Compile with standalone flag gives compilation errors in client code使用独立标志编译会在客户端代码中产生编译错误
【发布时间】:2015-02-05 15:36:08
【问题描述】:

我正在尝试使用 --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:未定义值或构造函数“Assign”

指向this code的第三行:

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

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

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

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

【问题讨论】:

  • 这看起来像是 F# 编译器 (fsc.exe) 中的一个错误,因为在使用和不使用 --standalone 编译器标志编译 Zero29 项目时,构建参数完全相同。
  • 我不能说我没有想到这个想法,因为我总是犹豫要说 Select is Broken...
  • 似乎在 Zero29 使用 --standalone 标志编译的情况下,Args.Assign 和朋友显示为“嵌套类型”。当 Zero29 在没有 --standalone 标志的情况下编译时,“Assign”变成了“Union case Args.Assign”。在独立的情况下,编译器似乎省略了一些东西。下一步可能是查看生成的类型。一些相关的讨论似乎在这里:stackoverflow.com/questions/17832203/…

标签: f# compiler-errors


【解决方案1】:

使用--standalone 开关编译的库不能公开任何 F# 数据类型。这一点在 Pickering (2007), p. 中明确说明。 210. 就您而言,受歧视的工会是这些被禁止的类型之一。该文件是可执行文件的事实在这里没有任何改变:当您尝试将其用作一个库时,它就变成了一个库。

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


皮克林河 (2007)。 F# 的基础。按下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多