C# 通过nuget包添加代码分析规则集
我正在尝试构建一个NuGet包,该包自动添加我们公司的代码分析字典并可更新 规则集添加到内容文件夹中,现在我想使用install.ps1脚本将规则集添加到项目文件中。C# 通过nuget包添加代码分析规则集,c#,powershell,nuget,code-analysis,envdte,C#,Powershell,Nuget,Code Analysis,Envdte,我正在尝试构建一个NuGet包,该包自动添加我们公司的代码分析字典并可更新 规则集添加到内容文件夹中,现在我想使用install.ps1脚本将规则集添加到项目文件中。 我想办法是使用envDTE,但除了这个无法找到CodeAnalysisRuleset节点的压倒性对象图之外,我找不到关于它的更多有用文档。 我在走正确的道路吗? 有关于如何在NuGet powershell中使用envDTE的相关教程/文档吗? 如何运行/调试我的安装脚本,而不必实际将其添加到包中并针对项目进行安装 旁注 尽管@
我想办法是使用envDTE,但除了这个无法找到CodeAnalysisRuleset节点的压倒性对象图之外,我找不到关于它的更多有用文档。
我在走正确的道路吗?
有关于如何在NuGet powershell中使用envDTE的相关教程/文档吗?
如何运行/调试我的安装脚本,而不必实际将其添加到包中并针对项目进行安装 旁注
尽管@Nicole Calinoiu展示了更好的方法,但这一点信息可能会在以后派上用场:
foreach ($config in $project.ConfigurationManager){
$config.Properties.Item("CodeAnalysisRuleSet").Value = "myruleset.ruleset"
}
没有必要编写这个脚本。可以通过导入的MSBuild
.props
文件注册规则集和字典,如下所述
例如,您的NuGet源文件夹结构可能如下所示(假设“CodeAnalysisSettings”是您的包ID):
- 建造
- CodeAnalysisSettings.props
- 内容
- MyCustomDictionary.xml
- MyRules.ruleset
CodeAnalysisSettings.props
的内容如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>MyRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="MyCustomDictionary.xml" />
</ItemGroup>
</Project>
真的
MyRules.ruleset
您也可以使用以下步骤手动执行此操作
- 右键单击项目
- 转到属性
- 转到下拉列表[运行此规则集]
- 选择[浏览..]选项
- 选择可以放置在源代码中预定义位置的公司规则集李>
- 单击“打开”窗口上的“打开”
- 保存项目文件
您可以对解决方案中的其他项目重复此步骤 我遇到了与评论中报告的问题相同的问题:字典是作为内容添加的,而不是作为
CodeAnalysisDictionary
我在nuget软件包的install.ps1中添加了这段代码来解决这个问题:
$dictionary = $project.ProjectItems | Where-Object {$_.Name.EndsWith("CustomDictionary.xml")}
$dictionary.Properties.Item("Buildaction").Value = [int]5;
该死!我昨天晚上才找到的!我也完成了导入字典的程序包。谢谢:)这里有什么我遗漏的吗?我创建了props文件,但是NuGet将CodeAnalysisDictionary添加为
内容的一种类型,而它应该是CodeAnalysisDictionary
的一种类型。我不知道为什么。但是,当我对cs文件使用Compile
时,它工作得很好。这是因为VS UI使用与代码分析MSBuild文件不同的规则来决定内容类型。尽管UI显示异常,但您应该发现您的字典正在被代码分析使用。@NicoleCalinoiu:遗憾的是,事实并非如此。我创建了一个NuGet软件包,并在本地硬盘上发布了它。当我通过“Manage NuGet Packages…”添加包时,它确实正确地将文件添加到了正确的位置。但是,由于字典被标记为内容类型
而不是CodeAnalysisDictionary
,因此代码分析引擎无法识别它,也不会使用自定义字典。您可以通过打破CA1709规则(创建一个名为NuGet
的公共类)来重现此问题。将字典(通过NuGet)添加为内容
并不能解决此问题。@NicoleCalinoiu:您能否分享您的NuGet解决方案(解包和打包)以及一个示例项目。每当我使用NuGet获取导入的字典文件时,VS2013都会将其标记为内容的一种类型,而CodeAnalysis引擎会忽略它。。。引擎只会在文件的“属性”下查找标记为CodeAnalysisDictionary
的文件。这就是我们今天要做的。但是我们有数百个项目,总的浪费时间加上不时发生的人为错误。nuget软件包会更有趣。