首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪造Fsc任务是将生成产品写入错误的目录。

伪造Fsc任务是将生成产品写入错误的目录。
EN

Stack Overflow用户
提问于 2014-11-14 17:28:37
回答 1查看 328关注 0票数 2

我只是在学习F#,并为类似hello world的应用程序设置了一个假的构建工具。(虽然“地狱世界”这个词偶尔会出现在脑海中.-)我使用的是Mac和emacs (通常试图通过偏好来避免GUI IDE)。

在对文档进行了一些修改之后,下面是我如何通过假调用F#编译器:

代码语言:javascript
复制
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任务。很简单,而且它看起来也很有效:

代码语言:javascript
复制
...
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/中。

因此,有两个问题:

  1. 这是在假构建工具中调用F#编译器的一种合理方式吗?
  2. 什么是我的误解,导致建设产品到错误的地方?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-03 19:04:16

这个问题,或一个非常类似的问题,在假问题#521中有报道,并且似乎已经在假拉请求#601中得到了修复,这一点可以看到。

对问题的解释

显然,除了我之外,每个人都知道,在FSharp.Compiler.Service中实现的FSharp.Compiler.Service编译器有跳过第一个参数的实践。请参阅第127行附近的FSharp.Compiler.Service/tests/service/FscTests.fs,其中我们看到了以下内容丰富的评论:

代码语言:javascript
复制
 // fsc parser skips the first argument by default;
 // perhaps this shouldn't happen in library code.

无论它应该发生还是不应该发生,都是发生了什么。由于-oFscHelper生成的参数中居于第一位,因此它被尽职尽责地忽略了(显然,它的论点也是如此)。因此,程序集转到默认位置,而不是指定的位置。

解决方案

临时解决方法是在--out:destinationFile字段之外,在FscParams设置器的OtherParams字段中指定Output;后者是在前者完成工作时要忽略的牺牲羔羊。

长期的解决方案是修复FscHelper生成的参数,使其在前面有一个额外的一次性参数;然后,这两个问题将在一股油腻的黑烟中消失。(当你想到它时,它的美就有点像芭蕾舞了。)这正是刚刚被@forki23 23合并到主目录中的内容:

代码语言:javascript
复制
 // Always prepend "fsc.exe" since fsc compiler skips the first argument
 let optsArr = Array.append [|"fsc.exe"|] optsArr

因此,该解决方案应该在最新版本的假(3.11.0)。

因此,我的两个问题的答案是:

  1. 是的,这似乎是调用F#编译器的一种合理方式。
  2. 我没有误解任何事情,它只是一个bug,一个修复正在进行中。

更重要的一点是:,实际的误解是,我应该检查假问题,并请求查看是否有其他人报告过这类事情,这就是我下次要做的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26935588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档