我有一个Visual Studio 2017解决方案,其中包含几个C#类库项目。在磁盘上,它们采用以下结构:
MyProduct
MyCompany
MyCompany.ModuleA
MyCompany.ModuleB
MyCompany.ModuleC
但是,当我在“管理解决方案的NuGet程序包”中查看它们时,复选框不一致地显示在对话框中。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个模块中的每一个都看起来是一致的。
答案 0 :(得分:2)
NuGet如何决定在“管理解决方案的软件包”对话框中输入什么名称?
这取决于NuGet管理器类型packages.config
或PackageReference
。
如果项目使用packages.config
,则项目名称将放在“管理解决方案的软件包”对话框中。如果项目使用PackageReference
,则会在其中放入项目文件名和相对路径。那是因为当我们使用.csproj
安装nuget软件包时,NuGet将更新项目文件PackageReference
。因此,在“管理解决方案的软件包”对话框中,它显示相对路径+项目文件名,例如ClassLibrary1\ClassLibrary1.csproj
。
NuGet为什么在输出文件夹中为这些临时文件创建这些临时文件? 模块C但不是模块A或B?
因为带有PackageReference
的NuGet会将为这些文件生成的msbuild项控制到obj\projectname.csproj.nuget.g.props
,obj\projectname.csproj.nuget.g.targets
和project.assets.json
文件中。
您可以卸载项目,检查项目文件MyCompany.ModuleC
是否使用PackageReference
,例如:
<ItemGroup>
<PackageReference Include="Newtonsoft.Json">
<Version>11.0.2</Version>
</PackageReference>
</ItemGroup>
有关更多详细信息,请访问以下官方博客:NuGet is now fully integrated into MSBuild。