Fake Glob运算符(!!)不扩展目录路径

时间:2018-01-30 17:53:00

标签: f# f#-fake

我有一种情况,在Fake脚本中,我试图使用Glob(!!)运算符从路径中获取所有单元测试dll。

问题是,在我的机器上,glob扩展功能无法正常工作,在其他类似的Windows 10机器上工作,它很好并找到了dll。

以下是一个例子:

let path = [function to generate path]
trace path [would look something like "c:\git\project\src\**\*UnitTest*"]
!! path.ToLower()
|> Seq.iter (fun file -> trace file ) [this would not output anything]

我尝试过很多事情:

  • 卸载旧版本的F#
  • 重新安装最新版本
  • 确保F#在我的路径中

我使用的软件版本是:

  • 假v4.63.2
  • Windows 10
  • F#4.1

不会抛出任何错误或异常 如果是F#或假冒问题,最好的方法是解决问题? 我怎么能弄清楚F#Fake正在使用哪个版本?

更新
我重新安装了F#4.1并使用fsi.exe使用以下命令执行了测试:

Microsoft (R) F# Interactive version 4.1
<snip>
#r @"packages/FAKE/tools/FakeLib.dll";;
open Fake;;
!! "**\*UnitTests.dll" |> Seq.iter (fun x -> trace x);;
C:\git\project1\bin\Debug\project1.UnitTests.dll
C:\git\project2\bin\Debug\project2.UnitTests.dll

!! "**\*UnitTests.dll".ToLower() |> Seq.iter (fun x -> trace x);;
C:\git\project1\bin\Debug\project1.UnitTests.dll
C:\git\project2\bin\Debug\project2.UnitTests.dll

找到所有测试dll,无论是否有ToLower()的调用。

当我从脚本中删除ToLower()时,它现在可以在我的机器上运行。

但是,在ToLower()上移除path的其他人机器上,导致他们找不到任何文件。

那么,是假冒使用fsi.exe的不同版本吗? 我已经打开了一个github问题,看看是否能说明问题:https://github.com/fsharp/FAKE/issues/1772

2 个答案:

答案 0 :(得分:2)

在所有.NET语言中的F#中,反斜杠用于字符串中的转义序列。

您需要转义反斜杠或使用逐字字符串,例如:

let path = "c:\\git\\project\\src\\**\\*UnitTest*"

let path = @"c:\git\project\src\**\*UnitTest*"

假也可以使用正斜杠:

let path = "c:/git/project/src/**/*UnitTest*"

如果您希望构建脚本在Linux上运行,您仍然必须使用正斜杠。

更好的选择是使用相对路径。您的构建脚本很可能存储在项目文件夹中。你可以写

let path = "src/**/*UnitTest*"

答案 1 :(得分:0)

使用以下脚本,我能够重现该问题,并确定问题是由于Windows 10如何处理路径中company名称的原始大小写。

我通过在文件路径表达式中将company名称更改为**来确认这一点,操作员工作并找到所有dll。

我记得更改公司名称的大小写,从所有大写到小写。如果我删除路径上的ToLower(),那么脚本工作正常并找到所有dll。

这个隐藏的问题,加上FAKE does a case sensitive search的方式,也无济于事。

Powershell的

packages\FAKE\tools\FAKE.exe glob.test.fsx

glob.test.fsx

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

let thePath = """C:\git\company/projectname/**/bin/Debug/*UnitTests.dll"""

sprintf "the path is %s" thePath |> trace 

!! thePath.ToLower() |> Seq.iter (fun f -> trace f)

我查看了在 ProcMon 中执行的进程,但没有看到目录的原始大小写。 NTFS文件系统仍将此目录视为其原始大小写(请参阅下面的注释)。

我每隔几个月重新对机器进行一次成像,所以很快就会消失,但很清楚发生了什么事情。

感谢所有帮助缩小问题的人。