我只是在学习F#,并为类似hello world的应用程序设置了一个假的构建工具。(虽然“地狱世界”这个词偶尔会出现在脑海中.-)我使用的是Mac和emacs (通常试图通过偏好来避免GUI IDE)。
在对文档进行了一些修改之后,下面是我如何通过假调用F#编译器:
let buildDir = @"./build-app/" // Where application build products go
Target "CompileApp" (fun _ -> // Compile application source code
!! @"src/app/**/*.fs" // Look for F# source files
|> Seq.toList // Convert FileIncludes to string list
|> Fsc (fun p -> // which is what the Fsc task wants
{p with //
FscTarget = Exe //
Platform = AnyCpu //
Output = (buildDir + "hello-fsharp.exe") }) // *** Writing to . instead of buildDir?
) //它使用!!以通常的方式生成所有源的FileIncludes,然后使用Seq.toList将其更改为文件名的string list,然后将文件名传递给Fsc任务。很简单,而且它看起来也很有效:
...
Starting Target: CompileApp (==> SetVersions)
FSC with args:[|"-o"; "./build-app/hello-fsharp.exe"; "--target:exe"; "--platform:anycpu";
"/Users/sgr/Documents/laboratory/hello-fsharp/src/app/hello-fsharp.fs"|]
Finished Target: CompileApp
...然而,不管上面的控制台输出是什么,实际的构建产品都会转到顶级目录,而不是构建目录。上面的消息看起来像是将-o参数传递给具有适当文件名的编译器,但是可执行文件被放在.中而不是./build-app/中。
因此,有两个问题:
发布于 2014-12-03 19:04:16
这个问题,或一个非常类似的问题,在假问题#521中有报道,并且似乎已经在假拉请求#601中得到了修复,这一点可以看到。
对问题的解释
显然,除了我之外,每个人都知道,在FSharp.Compiler.Service中实现的FSharp.Compiler.Service编译器有跳过第一个参数的实践。请参阅第127行附近的FSharp.Compiler.Service/tests/service/FscTests.fs,其中我们看到了以下内容丰富的评论:
// fsc parser skips the first argument by default;
// perhaps this shouldn't happen in library code.无论它应该发生还是不应该发生,都是发生了什么。由于-o在FscHelper生成的参数中居于第一位,因此它被尽职尽责地忽略了(显然,它的论点也是如此)。因此,程序集转到默认位置,而不是指定的位置。
解决方案
临时解决方法是在--out:destinationFile字段之外,在FscParams设置器的OtherParams字段中指定Output;后者是在前者完成工作时要忽略的牺牲羔羊。
长期的解决方案是修复FscHelper生成的参数,使其在前面有一个额外的一次性参数;然后,这两个问题将在一股油腻的黑烟中消失。(当你想到它时,它的美就有点像芭蕾舞了。)这正是刚刚被@forki23 23合并到主目录中的内容:
// Always prepend "fsc.exe" since fsc compiler skips the first argument
let optsArr = Array.append [|"fsc.exe"|] optsArr因此,该解决方案应该在最新版本的假(3.11.0)。
因此,我的两个问题的答案是:
更重要的一点是:,实际的误解是,我应该检查假问题,并请求查看是否有其他人报告过这类事情,这就是我下次要做的。
https://stackoverflow.com/questions/26935588
复制相似问题