使用 Directory.Build.Prop 在.NET Framework中添加包

3

我有一个Visual Studio解决方案,我正在尝试在所有项目中使用build 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 Core和框架项目,因为所有新的核心项目都使用SDK风格的项目,而框架项目则不是。但我不确定在“否则”部分应该添加什么内容才能将这些分析器添加到其中。
由于所使用的分析器是平台无关的,我尝试使用包引用或引用元素来添加它。但它并没有按预期工作,我发现分析器不起作用,而且还会搞乱框架项目中的其他引用(引用上出现警告标志,项目无法构建)。
此外,我认为这与框架项目中的包引用在packages.config文件中进行管理有关,但我不确定是否可以从build.props中对其应用某些内容。
1个回答

8
实际上,.NET Framework 项目支持 PackageReference NuGet 管理格式。请参见 this official document
如果您想要在 .NET Framework 项目中使用 Directory.Build.props 文件以使用 packages.config NuGet 管理格式安装一些 NuGet 包,则不可能。因为 packages.config NuGet 管理格式使用 packages.config 安装包,而 proj 文件无法修改 packages.config 文件。
但是,只有 PackageReference NuGet 管理可以使用 proj 在没有 packages.config 文件的情况下安装 NuGet 包。
因此,现在唯一需要考虑的是如何更改已使用 packages.config 安装了一些 NuGet 包的 .NETt Framework 项目。
建议:
在进行此操作之前,您可以为所有项目创建备份。

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

enter image description here

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

2) 然后,在Directory.Build.Prop文件中为.NET Framework项目添加这些内容,就像你为.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属性,像这样:

enter image description here

  • 其次,重新加载项目,然后您可以迁移到 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>

我正在尝试做这个,但其中一个包裹显示不符合迁移条件。 - undefined
找到原因了,是ASP.NET项目... 目前无法对C++和ASP.NET项目进行迁移。所以,我又回到了起点。 - undefined
感谢您的反馈。更多的信息将帮助我们更快地解决问题。我已经更新了我的回答,详见更新1。我们提供了更多的解决方案。 - undefined
嘿,按照你的建议,包确实被移植了,但是当我构建项目时,所有的包引用似乎都从列表中消失了。 - undefined
可能是因为 web config 中的运行时条目吗? - undefined
packagereference节点位于csproj文件中。你知道解决方案资源管理器的引用列表中缺少这些NuGet包吗?如果是的话,卸载项目,然后重新加载项目,使用详细的构建日志,我可以在输出窗口中看到NuGet包。确保csproj文件的packagereference节点下没有ExcludeAssets节点,确保web.config文件上没有其他限制节点。如果这些方法都没有帮助,请与我们分享web.config和csproj文件的packagereference节点。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接