尝试使用 Fake.FscHelper 时出现 FAKE 错误

FAKE error when trying to use Fake.FscHelper

我正在尝试使用 FAKE 构建我的 F# 项目。 build.fsx 如下所示并且工作正常。

#r "packages/FAKE/tools/FakeLib.dll"

open Fake

Target "Default" (fun _ ->
    trace "Hello World from FAKE"
)

RunTargetOrDefault "Default"

那我想用FAKE的fsc。按照官方教程,我添加了一行 open Fake.FscHelper 并得到以下错误信息:

#r "packages/FAKE/tools/FakeLib.dll"

open Fake
open Fake.FscHelper

// this value is not a function and can not be applied
// union case FscParam.Target: TargetType -> FscParam
Target "Default" (fun _ ->
~~~~~~~~~~~~~~~~
    trace "Hello World from FAKE"
)

RunTargetOrDefault "Default"

如果有人能给我任何建议,我将不胜感激。

我在 Mac 上使用 VS Code 和 Mono 4.2.1。

我的 paket.lock 如下所示:

NUGET
  remote: https://www.nuget.org/api/v2
  specs:
    FAKE (4.21.0)
    FSharp.Core (4.0.0.1)
    FsUnit (2.0.0)
      FSharp.Core (>= 3.1.2.5)
      NUnit (3.0.1)
    NUnit (3.0.1)

发生这种情况是因为模块 FscHelper 定义了一个名为 Target 的构造函数(see source), and that constructor conflicts with the Target function from the TargetHelper module. There is an issue filed about it.

在问题得到解决之前,可以通过三种方法解决这个问题:

  1. 不要打开FscHelper,只要合格地使用它的所有内脏(例如FscHelper.Compile等)

  2. 在本地范围内重新命名 TargetHelper.Target 函数:

    open Fake
    open Fake.FscHelper
    
    let Target = TargetHelper.Target
    
    Target "Default" (fun _ ->
        trace "Hello World from FAKE"
    )
    
  3. 重新排序 open 语句:

    open Fake.FscHelper
    open Fake
    

并且由于您正在使用此助手,请注意 documentation for it is outdated. In particular, the Fsc task is deprecated in favor of the Compile task (see source).

更改打开语句的顺序

#r @"packages/FAKE/tools/FakeLib.dll"
open Fake.FscHelper
open Fake

Target "a" (fun _ -> 
  ["a.fs"] |> Compile []

打开语句的顺序决定了名称解析的优先级,以后打开的模块和命名空间优先。