简体   繁体   中英

Integrating FxCop Gives an error : FAKE F#MAKE

I am using FxCop in FAKE but it is giving an error ie

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

While all targets are successfully build.

here is my code :

    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"})
)

It also shows : Project error : No targets were selected .

The FAKE documentation doesn't make it clear enough, but apparently you need to explicitly specify one of two things:

  1. Which FxCop rules you want to run, or
  2. The path to an "FxCop project file" (a file with the .FxCop extension).

I can't tell you how to write an FxCop project file since I've never done so myself, but maybe the programmer who set up the MsBuild system you've working with already did so. If he did, then you just need to add the following parameter to your FxCop call in your FAKE build script:

ProjectFile = buildDir </> "filename.FxCop"

where filename , of course, should be replaced by a real file name.

If you don't have an FxCop project file, then apparently you have to explicitly specify a list of FxCop rules in the RuleLibraries parameter. First, you need to find out which FxCop rules are available. To do that, look in your FxCop installation directory (on my system, where I have an older version of FxCop installed, it was C:\\Program Files (x86)\\Microsoft FxCop 1.36 , but it may be different for you) for a Rules folder. That folder should contain several DLLs; for example, on my system, the Rules folder contained:

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

... and several other DLLs that I'm not going to bother typing out. Now you just make that list of filenames into an F# list:

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

There should be sensible defaults for that, but currently it looks like you have to specify that list of rules by hand. So try writing your target to look something like this:

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"})
)

Remember to separate your list items with ; (semicolon): in F#, the , (comma) character is ONLY for tuples. And don't just copy my example verbatim, but actually look in your FxCop installation directory to see what rule DLLs are available, and include those. (As many, or as few, as your project actually needs).

Also, I don't know if you actually have to specify the .dll extension; you might be able to use ["DesignRules"; "GlobalizationRules"] ["DesignRules"; "GlobalizationRules"] (and so on). But it's probably just as simple to use the .dll extension and just copy and paste from the filenames.

I haven't tested this myself, so I hope this works for you. If it doesn't, let me know.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM