Компиляция с автономным флагом дает ошибки компиляции в клиентском коде

Я пытаюсь скомпилировать Zero29 с флагом --standalone. Сам проект компилируется, но у меня есть проект unit test, который выполняет некоторый код в проекте Zero29, хотя это исполняемая программа (.exe).

Все работает отлично без флага --standalone.

Однако, когда я добавляю флаг компиляции --standalone в проект Zero29, проект Zero29 компилируется отлично, но в проекте unit test компилятор жалуется на этот Discriminated Union определенный в проекте Zero29:

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

Проект unit test напрямую ссылается на проект Zero29:

Zero29.UnitTests --references → Zero29 (где добавлен --стандарт)

Когда я пытаюсь скомпилировать все решение, проект Zero29 компилируется с флагом --standalone, но компиляция Zero29.UnitTests не выполняется. Есть несколько ошибок, но они все одинаковы, поэтому здесь один пример:

error FS0039: значение или конструктор "Назначить" не определено

Что указывает на третью строку этого кода:

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

Странно то, что, компилятор жалуется на Assign в третьей строке этого фрагмента кода, он не жалуется на использование Args.Parse, даже если он определенный в том же файле кода, что и Arg Discriminated Union.

Почему он это делает и как я могу решить эту проблему?

(Я попытался устранить проблему здесь, но ссылки, которые я предоставил, указывают на фактические файлы кода на GitHub, если требуется дополнительная информация.)

Ответ 1

Библиотеки, скомпилированные с помощью --standalone, не могут выставлять какие-либо типы данных F #. Это, например, прямо сказано в Пикеринге (2007), с. 210. В вашем случае дискриминационный союз является одним из этих запрещенных типов. Тот факт, что файл является исполняемым файлом, ничего не меняет: он становится библиотекой в ​​тот момент, когда вы пытаетесь использовать его как один.

Здесь также было несколько отчетов (например, здесь и здесь), что даже библиотеки, скомпилированные с --standalone, ведут себя, цитируя один из этих источников, "фанки". Можно с уверенностью сказать, что использование этого переключателя, возможно, должно быть ограничено только автономными исполняемыми файлами (и они не могут претендовать на роль библиотеки даже в ходе модульных тестов).


Pickering R. (2007). Основы F #. Apress.