F# Compile with standalone标志在客户端代码中给出编译错误
我正在尝试使用F# Compile with standalone标志在客户端代码中给出编译错误,f#,compiler-errors,F#,Compiler Errors,我正在尝试使用--standalone编译器标志进行编译。项目本身编译得很好,但我有一个单元测试项目,它在Zero29项目中执行一些代码,即使它是一个可执行程序(.exe) 没有--standalone编译标志,一切正常 但是,当我将--standalone编译标志添加到Zero29项目时,Zero29项目可以很好地编译,但是在单元测试项目中,编译器会抱怨这种有区别的联合: 单元测试项目直接引用Zero29项目: Zero29.UnitTests--引用-->Zero29(其中添加了--stan
--standalone
编译器标志进行编译。项目本身编译得很好,但我有一个单元测试项目,它在Zero29项目中执行一些代码,即使它是一个可执行程序(.exe)
没有--standalone
编译标志,一切正常
但是,当我将--standalone
编译标志添加到Zero29项目时,Zero29项目可以很好地编译,但是在单元测试项目中,编译器会抱怨这种有区别的联合:
单元测试项目直接引用Zero29项目:
Zero29.UnitTests--引用-->Zero29(其中添加了--standalone)
当我尝试编译整个解决方案时,Zero29项目使用--standalone
标志进行编译,但是Zero29.UnitTests的编译失败。有几个错误,但它们都是相同的,因此这里有一个示例:
错误FS0039:未定义值或构造函数“Assign”
它指向第三行:
let ParseAssignVersionReturnsCorrectResult(版本:string)=
让实际值=[|“-a”版本|]|>Args.Parse
验证顺序(收费表)@>
奇怪的是,虽然编译器在这段代码片段的第三行抱怨Assign
,但它却没有抱怨使用了Args.Parse
,即使它是
为什么会这样,我如何解决这个问题
(我试图在这里找出问题所在,但如果需要更多信息,我提供的链接指向GitHub上的实际代码文件。)使用
--standalone
开关编译的库无法公开任何F#数据类型。这一点在皮克林(2007)的第。210在你的情况下,一个受歧视的联盟就是这些被禁止的类型之一。文件是可执行文件这一事实在这里没有任何改变:当您试图将其作为库使用时,它就变成了库
也有多个报告(例如,和)指出,即使是使用--standalone
编译的库也会有行为,引用其中一个源代码“funky”。可以肯定地说,此开关的使用可能仅限于独立的可执行文件(即使在单元测试中,它们也不能假装是库)
Pickering R.(2007)。F#.Apress的基础。这看起来像是F#编译器(fsc.exe)中的一个bug由于编译Zero29项目时使用和不使用
--standalone
编译器标志时,构建参数完全相同。我不能说我没有想到这个想法,因为我总是犹豫说Select被破坏了……似乎Zero29是使用--standalone
标志编译的,Args.Assign和好友显示为“嵌套类型”。在编译Zero29时,如果不使用--standalone
标志,“Assign”将变成“Union case Args.Assign”。编译器似乎忽略了独立案例中的某些内容。下一步可能是查看生成的类型。这里有一些相关的讨论:
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
let ParseAssignVersionReturnsCorrectResult(version : string) =
let actual = [| "-a"; version |] |> Args.Parse
verify <@ [Assign(Version version)] = (actual |> Seq.toList) @>