Интеграция FxCop выдает ошибку: FAKE F#MAKE

Я использую FxCop в FAKE, но он дает ошибку, т.е.

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 ответ

Документация FAKE не дает ясного объяснения, но, очевидно, вам нужно явно указать одну из двух вещей:

  1. Какие правила FxCop вы хотите запустить, или
  2. Путь к "файлу проекта FxCop" (файл с .FxCop расширение).

Я не могу рассказать вам, как написать файл проекта FxCop, поскольку сам никогда этого не делал, но, возможно, программист, который настроил систему MsBuild, с которой вы работали, уже сделал это. Если он это сделал, то вам просто нужно добавить следующий параметр в ваш FxCop вызовите в вашем скрипте сборки FAKE:

ProjectFile = buildDir </> "filename.FxCop"

где filenameРазумеется, следует заменить реальным именем файла.

Если у вас нет FxCop файл проекта, то, очевидно, вы должны явно указать список правил FxCop в RuleLibraries параметр. Во-первых, вам нужно выяснить, какие правила 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 продление срока действия; вы могли бы использовать ["DesignRules"; "GlobalizationRules"] (и так далее). Но, вероятно, так же просто использовать .dll расширение и просто скопировать и вставить из имен файлов.

Я не проверял это сам, поэтому я надеюсь, что это работает для вас. Если это не так, дайте мне знать.

Другие вопросы по тегам