Отвечая на свой вопрос, если кто-то еще столкнется с этим. Я нашел решение, но честно предупреждаю, это некрасиво.
- Я взял пример решения C # из Github, загрузил его в Visual Studio и использовал NuGet для установки анализаторов FxCop. Это установило анализаторы и изменило файлы .csproj решения, чтобы они ссылались на них. В моем случае я нашел копию анализаторов в C: \ users \ myname.nuget \ packages.
- I compared the modified .csproj files to the originals, to see what changes had been made during installation. I recommend anyone following along make this comparison themselves, but in my case, the changes were:
- Five Import elements at the top referencing various .props files.
- Пустой элемент NuGetPackageImportStamp.
- Две новые ItemGroups внизу, первая содержит единственный элемент с именем None, а вторая содержит различные элементы Analyzer, ссылающиеся на .dll.
- Новая цель, чтобы гарантировать, что файлы .props действительно существуют.
- Я написал программу на C #, которая приняла произвольное решение, нашла внутри все файлы .csproj и вручную добавила к ним эти новые элементы XML. Я без проблем пропустил одноэлементную ItemGroup и Target.
В идеале вы должны затем (из той же программы C #) вызвать msbuild в файле .sln, сохранить каждую строку вывода, соответствующую регулярному выражению): предупреждение CA \ d \ d \ d \ d: (т.е. предупреждения, созданные FxCop) и восстановить исходные файлы .csproj. Все это я делал вручную. Вот код для манипуляции с XML:
static void addAnalyzersToCsProj(string file)
{
string[] packages = new string[]
{
@"C:\users\myname\.nuget\packages\microsoft.codeanalysis.fxcopanalyzers\3.0.0\build\Microsoft.CodeAnalysis.FxCopAnalyzers.props",
@"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\build\Microsoft.CodeAnalysis.VersionCheckAnalyzer.props",
@"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\build\Microsoft.CodeQuality.Analyzers.props",
@"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\build\Microsoft.NetCore.Analyzers.props",
@"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\build\Microsoft.NetFramework.Analyzers.props",
};
var root = XElement.Load(file);
var ns = "";
for (var i = 0; i < 5; i++)
{
XElement packageImport = new XElement(ns+"Import");
packageImport.SetAttributeValue("Project", packages[i]);
string condition = "Exists('" + packages[i] + "')";
packageImport.SetAttributeValue("Condition", condition);
root.AddFirst(packageImport);
}
var propertyGroup = root.Descendants(ns + "PropertyGroup").First();
var stamp = new XElement(ns+"NuGetPackageImportStamp", "");
propertyGroup.Elements().Last().AddAfterSelf(stamp);
var newGroup = new XElement(ns+"ItemGroup");
// do we need to include the "None Include="packages.config"" thing?
string[] libraries = new string[]
{
@"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.VersionCheckAnalyzer.resources.dll",
@"C:\users\myname\.nuget\packages\microsoft.codeanalysis.versioncheckanalyzer\3.0.0\analyzers\dotnet\Microsoft.CodeAnalysis.VersionCheckAnalyzer.dll",
@"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Humanizer.dll",
@"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers.dll",
@"C:\users\myname\.nuget\packages\microsoft.codequality.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.CodeQuality.CSharp.Analyzers.dll",
@"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetCore.Analyzers.dll",
@"C:\users\myname\.nuget\packages\microsoft.netcore.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetCore.CSharp.Analyzers.dll",
@"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetFramework.Analyzers.dll",
@"C:\users\myname\.nuget\packages\microsoft.netframework.analyzers\3.0.0\analyzers\dotnet\cs\Microsoft.NetFramework.CSharp.Analyzers.dll",
};
foreach (string lib in libraries)
{
XElement analyzer = new XElement(ns+"Analyzer");
analyzer.SetAttributeValue("Include", lib);
newGroup.AddFirst(analyzer);
}
Console.WriteLine(root.Elements().Last().ToString());
root.Elements().Last().AddAfterSelf(newGroup);
root.Save(file, SaveOptions.None);
// and do we need to include the error checking target?
}
Насколько я могу судить, это работает, хотя я понятия не имею, что произойдет, если вы попытаетесь сделать это в решении, в котором анализаторы уже установлены нормально.
Запуск анализаторов FxCop через msbuild кажется неэффективным, но я не нашел лучшего способа сделать это. Похоже, они созданы для работы только в компиляторе. Надеюсь, я ошибаюсь, и я все равно был бы признателен за любой совет о том, как запускать анализаторы автоматически без необходимости сборки всего проекта.
person
anon
schedule
24.06.2020