使用 Directory.Build.Prop for .NET Framework 添加包

Cha*_*ari 4 .net msbuild visual-studio

我有一个 Visual Studio 解决方案,我尝试在所有项目中使用构建 prop 文件添加代码分析器。我的项目依赖于 .NET Core 以及框架。我有以下 Directory.Build.Prop 文件

<Project>
  <Choose>    
    <When Condition="$(UsingMicrosoftNETSdk) == 'true'">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
        <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
        <RunCodeAnalysis>true</RunCodeAnalysis>
      </PropertyGroup>
      <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory).editorconfig" Link=".editorconfig" />
      </ItemGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.1">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
      </ItemGroup>
   </When>
    <Otherwise>
    </Otherwise>
  </Choose>
</Project>
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用该属性区分 .Net core 和框架项目UsingMicrosoftNETSdk,因为所有新核心项目都使用 SDK 风格的项目,而 Framework 项目则不然。但我不太确定应该在“其他”部分中添加什么来将这些分析器添加到其中。

由于使用的分析器是独立于平台的,因此我尝试使用包引用或引用元素来添加它。但它没有按预期工作,而且我看到分析器没有工作,而且它弄乱了框架项目中的其他引用(在引用上获取警告标志,项目无法构建)。

另外我认为这与在 packages.config 文件中管理的框架项目中的包引用有关,但我不确定我们是否可以从 build.props 中应用一些东西

Mr *_*ian 8

实际上,.NET Framework 项目支持PackageReference NuGet 管理格式。参见这个官方文档

而如果你想使用Directory.Build.props文件来安装一些带有packages.config NuGet管理格式的.NET Framework项目的NuGet包,这是不可能的,因为packages.configNuGet管理格式使用packages.config来安装包,并且proj文件无法修改packages.config文件。

只有PackageReference NuGet管理可以使用proj来安装没有文件的NuGet包packages.config

因此,现在唯一考虑的是如何更改使用.NETt Framework安装了一些NuGet包的项目packages.config

建议

在执行此操作之前,您可以对所有项目进行备份。

1)因此,在 VS 上打开所有 .NET Framework 项目,然后右键单击每个packages.config文件 --> 单击Migrate packages.config into PackageReference

在此输入图像描述

然后,您的所有 .NET Framework 项目都可以像 .NET Core 项目一样使用PackageReference 。

2)然后,将这些内容添加到文件中的 .NET Framework 项目中,Directory.Build.Prop就像您为 .NET Core 所做的那样。

<ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.1">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
 </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

更新1

在此过程之前,您可以为您的解决方案进行备份。

=========================

对于ASP.NET框架项目,可以使用PackageReference。只需做一些修改即可。

  • 首先,在解决方案资源管理器上卸载这些项目,然后打开 ASP.NET 项目的每个 csproj 文件。

请记住像这样评论该ProjectTypeGuids属性:

在此输入图像描述

  • 其次,然后重新加载项目,然后您可以迁移到PackageReference。右键单击packages.config并单击Migrate packages.config into PackageReference

完成此步骤后,卸载项目并恢复ProjectTypeGuids属性。

对每个 ASP.NET 项目尝试以下步骤。

=========================

对于 C++ 项目,NuGet 包Microsoft.CodeAnalysis.NetAnalyzers不适合它们,因此您必须进行判断调用以从当前逻辑操作中删除 C++ 项目。

C++ 项目使用PlatformToolset属性来构建项目,而 .NET 项目不使用它。所以这是一个很好的判断条件。

用这个:

<Project>
  <Choose>    
    <!--exlcude c++ projects and all the net framework and net core projects can use PackageReference-->
    <When Condition="'$(PlatformToolset)'==''">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
        <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
        <RunCodeAnalysis>true</RunCodeAnalysis>
      </PropertyGroup>
      <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory).editorconfig" Link=".editorconfig" />
      </ItemGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.1">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
      </ItemGroup>
   </When>
    <Otherwise>
    </Otherwise>
  </Choose>
</Project>
Run Code Online (Sandbox Code Playgroud)