Nuget "Manage Packages" 对话框。项目名称混淆

Nuget "Manage Packages" dialog. Project names are mixed up

我有一个 Visual Studio 2017 解决方案,其中包含多个 C# class 库项目。在磁盘上,它们采用这种结构:

MyProduct
    MyCompany
        MyCompany.ModuleA
        MyCompany.ModuleB
        MyCompany.ModuleC

但是当我在“Manage NuGet Packages for Solution”中查看它们时,复选框在对话框中的显示不一致。ModuleC 出现得很奇怪。像这样:

MyCompany.ModuleA
MyCompany.ModuleB
MyProduct\MyCompany\MyCompany.ModuleC

此外,每当我构建模块 C 时,它都会在其输出 /obj 文件夹中不断创建以下 3 个文件

 - MyCompany.ModuleC.csproj.nuget.g.props
 - MyCompany.ModuleC.csproj.nuget.g.targets 
 - project.assets.json

其他两个模块都没有这样做。

我正在尝试了解不一致的原因,并在可能的情况下进行修复。我已经尝试梳理这些不同项目的 .csproj 文件的文本,但我无法发现可能导致这种情况发生的任何差异。 .SLN 文件项目条目的原始文本对于 3 个模块中的每一个看起来都是一致的。

  1. NuGet 如何决定在“管理解决方案包”对话框中放入什么名称?
  2. 为什么 NuGet 在输出文件夹中为模块 C 而不是模块 A 或 B 创建这些临时文件?

How does NuGet decide what name to put in the Manage Packages for Solution dialog?

这取决于 NuGet 管理器类型,packages.configPackageReference

如果项目使用 packages.config,项目名称将放在“管理解决方案包”对话框中。如果项目使用PackageReference,项目文件名和相对路径将被放入其中。那是因为当我们使用 PackageReference 安装 nuget 包时,NuGet 将更新项目文件 .csproj。因此,在“管理解决方案包”对话框中,它显示相对路径+项目文件名,如 ClassLibrary1\ClassLibrary1.csproj.

Why is NuGet creating those temporary files in the output folder for Module C but not Module's A or B?

因为带有 PackageReference 的 NuGet 控制为这些文件生成的 msbuild 项目进入 obj\projectname.csproj.nuget.g.propsobj\projectname.csproj.nuget.g.targetsproject.assets.json 文件。

您可以卸载您的项目,检查项目文件是否MyCompany.ModuleC使用PackageReference,如:

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json">
      <Version>11.0.2</Version>
    </PackageReference>
  </ItemGroup>

更多详情请查看官方博客:NuGet is now fully integrated into MSBuild.