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

Add packages using Directory.Build.Prop for .NET Framework

我有一个 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>

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

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

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

实际上,.NET Framework 项目支持PackageReference NuGet 管理格式。参见 this official document

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

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

因此,现在唯一需要考虑的是如何更改已经使用packages.config.

安装了一些NuGet包的.NETt Framework项目

建议

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

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>

更新 1

这个过程之前,您可以为您的解决方案做一个备份。

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

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

  • 首先,在 Solution Explorer 上卸载这些项目,然后打开 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>