集成FxCop会产生错误:FAKE F#MAKE

时间:2017-03-28 06:16:37

标签: f# f#-fake

我在FAKE中使用FxCop但它出错了 即

Analysis was not performed; at least one valid rules assembly and one valid target file must be specified. * 1 total analysis engine exceptions.

虽然所有目标都已成功构建。

这是我的代码:

    Target "FxCop" (fun _ ->
    !! (buildDir + "/**/*.dll")
        ++ (buildDir + "/**/*.exe")
        |> FxCop (fun p ->
            {p with
                //Override default parameters
                ReportFileName = testDir + "FXCopResults.xml";

                ToolPath = "D:/Fake/FAKE-Calculator/tools/FxCop/FxCopCmd.exe"})
)

它还显示:项目错误:未选择任何目标。

1 个答案:

答案 0 :(得分:2)

FAKE文档没有说清楚,但显然你需要明确指定两件事之一:

  1. 您要运行哪种FxCop规则,或
  2. “FxCop项目文件”的路径(扩展名为.FxCop的文件)。
  3. 我无法告诉你如何写一个FxCop项目文件,因为我自己从未这样做过,但也许设置你正在使用的MsBuild系统的程序员已经这样做了。如果他这样做,那么您只需要在FAKE构建脚本中的FxCop调用中添加以下参数:

    ProjectFile = buildDir </> "filename.FxCop"
    

    其中filename当然应该用真实的文件名替换。

    如果您没有FxCop项目文件,那么显然您必须在RuleLibraries参数中明确指定FxCop规则列表。首先,您需要找出可用的FxCop规则。要做到这一点,请查看您的FxCop安装目录(在我的系统上,我安装了旧版本的FxCop,它是C:\Program Files (x86)\Microsoft FxCop 1.36,但对于Rules文件夹可能有所不同)。该文件夹应包含多个DLL;例如,在我的系统上,Rules文件夹包含:

    • DesignRules.dll
    • GlobalizationRules.dll
    • InteroperabilityRules.dll

    ...以及其他一些我不打算打字的DLL。现在,您只需将该文件名列表转换为F#列表:

    RulesLibraries = ["DesignRules.dll"; "GlobalizationRules.dll"] // and so on
    

    应该是合理的默认值,但目前看来你必须手动指定规则列表。所以尝试编写你的目标看起来像这样:

    Target "FxCop" (fun _ ->
    !! (buildDir + "/**/*.dll")
        ++ (buildDir + "/**/*.exe")
        |> FxCop (fun p ->
            {p with
                //Override default parameters
                ReportFileName = testDir + "FXCopResults.xml";
                RulesLibraries = ["DesignRules.dll"; "GlobalizationRules.dll"] // etc.
                ToolPath = "D:/Fake/FAKE-Calculator/tools/FxCop/FxCopCmd.exe"})
    )
    

    请记住将列表项与;(分号)分开:在F#中,,(逗号)字符仅适用于元组。并且不要只是逐字复制我的示例,而是实际查看您的FxCop安装目录以查看可用的规则DLL,并包含这些规则。 (与项目实际需要的一样多,或者很少)。

    另外,我不知道你是否真的需要指定.dll扩展名;您可能可以使用["DesignRules"; "GlobalizationRules"](依此类推)。但是使用.dll扩展名可能同样简单,只需从文件名中复制和粘贴即可。

    我自己没有测试过,所以我希望这对你有用。如果没有,请告诉我。