我有一种情况,在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#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
答案 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文件系统仍将此目录视为其原始大小写(请参阅下面的注释)。
我每隔几个月重新对机器进行一次成像,所以很快就会消失,但很清楚发生了什么事情。
感谢所有帮助缩小问题的人。