Packages.config 和 Visual Studio 中的 PackageReference

Packages.config and PackageReference in Visual Studio

我正在帮助无法获得 Visual Studio WPF 项目的同事在我们的 TFS 2015 构建服务器中进行构建。我已将他的代码的最新版本提取(获取最新版本)到我的 VS 2019 实例中。我无法在我的开发箱上构建它。当我尝试在我的开发箱上构建解决方案时,我收到类似这样的错误:

The tag 'ModernDialog' does not exist in XML namespace 'http://firstfloorsoftware.com/ModernUI'. The tag 'Interaction.Triggers' does not exist in XML namespace 'http://schemas.microsoft.com/expression/2010/interactivity'.

当我的同事将更改签入 TFS 时,它失败并出现如下错误:

Unable to find version '5.2.0' of package 'MvvmLightLibs'. Unable to find version '1.0.9' of package 'ModernUI.WPF'.

我首先尝试更新他在项目中拥有的 NuGet 包,但效果不佳。即使恢复到最新版本也无法在我的机器上构建。

我同事的做法是把Visual Studio解决方案中的所有NuGet包都拆出来,然后四处寻找DLL,然后放到项目中,在项目中引用。它在他的系统上构建,但不在 TFS 构建服务器上。

所以,我一直在寻找可能的原因。我看到了这个 Microsoft 文档 Migrate from packages.config to PackageReference。我对 packages.config 或 PackageReference 都不熟悉,但我觉得 PackageReference 是包含 NuGet 包的“首选”方式。

这会引发问题。目前我们的TFS构建服务器Visual Studio的最高版本是VS 2015。根据参考文章,VS 2015使用packages.config文件。比 VS 2015 更新的任何东西都使用包(我认为是 PackageReference)。

我将失败的 WPF 解决方案与我使用过的另一个在构建服务器上构建良好的解决方案进行了比较。构建的解决方案,我称之为 SolutionA,在解决方案的根目录下有一个 packages 文件夹,但在解决方案的每个项目中也有 packages.config 个文件。构建失败的解决方案,我称之为 SolutionB,在其根目录下有 packages 文件夹,在单元测试项目中有一个 packages.config 文件。 (我认为单元项目构建得很好。)

即使我们使用的是较新版本的 Visual Studio,我怀疑构建服务器的问题是由于构建服务器具有较旧版本的 Visual Studio。我们的 Visual Studio 许可证数量有限,所以我无法在构建服务器上放置更新版本的 Visual Studio。那么,如何将这些 packages.config 文件放入每个项目中?

首先,你的解决方案实际上使用了packages.config nuget管理格式。这种格式使每个项目都有一个名为 packages.config 的文件,其中列出了所有 nuget 包及其版本。这就是 packages.config nuget 管理格式的特点。所以你还应该确保你已经将该文件提交到 TFS.

第二,将packages.config迁移到PackageReference不是一件容易的事,应该用VSIDE来完成。大多数情况下,您必须对项目的每个 csproj 文件进行重大更改。实际上,PackageReference 是灵活和轻量级的,它没有存储所有 nuget 包的 packages.config 文件和包文件夹。只需将它们直接嵌入到 proj 文件中即可。到目前为止,PackageReference 是主流。

您的问题是您没有对 TFS 构建执行 nuget 恢复操作以在 packages 文件夹下制作丢失的 nuget 包,以便构建过程将找到那些 nuget 包和让它们发挥作用。

您应该添加一个 nuget restore xxx\sln 命令行或任务。

请检查one,two,three