nuget 命令行更新未检测到所有需要更新的 packages.config

nuget command line update doesn't detect all packages.config which need to be updated

我们有一个构建步骤,用于在构建服务器 (TeamCity) 上的解决方案中安装和更新 nuget 包。最近这已经停止正确地进行更新。我对此进行了调查,发现问题似乎是 nuget 中的更新命令没有更新解决方案中的所有项目。我可以在我的本地机器上复制它。

当我运行这个命令时:

.nuget\NuGet.exe update Our.Company.sln -Source http:/ourTcServer:8888/guestAuth/app/nuget/v1/FeedService.svc -RepositoryPath packages -verbosity detailed

我得到了它要更新的 10 个项目的列表

Found 10 projects with a packages.config file. (
Company.Project1.csproj,
Company.Project2.csproj,
Company.Project3.csproj, 
Company.Project4.csproj, 
Company.Project4.SubProject1.csproj,
Company.Project4.SubProject2.csproj,
Company.Project1.SubProject1.csproj, 
Company.Project1.SubProject2.csproj,
Company.Project2.SubProject1.csproj,         
Company.Project2.SubProject1.FurtherSubProject1.csproj)

然而,该解决方案包含 13 个项目,这些项目都包含 packages.config 个文件,据我所知与其他任何项目都没有什么不同。这些项目是一个单独的项目及其子项目,我们的项目目录结构与项目名称相匹配(因此 project1.subproject1 意味着 subproject1 位于 project1 内的文件夹中)以防万一。有问题的项目都在一个具有特定名称的项目中,例如:

Company.Something.SomethingElse.Routing
Company.Something.SomethingElse.Routing.Tests
Company.Something.SomethingElse.Routing.Tests.Specifications

以防名称的路由部分出现问题(我们在包名称末尾使用单词 Resources 之前遇到了问题)

我们有 50 多个解决方案,它们都使用相同的构建配置和步骤,并且适用于所有这些解决方案。此解决方案似乎是唯一未正确更新的解决方案。

有谁知道为什么会这样?或者有人知道在解决方案中查找包的代码会导致它找不到某些 packages.config 文件吗?或者任何可能有助于追踪此问题的信息?

好的,所以问题是我们重命名了一些项目,因此 .csproj 文件并没有删除到旧的、未使用的项目文件,而 nuget 有一段代码可以找到它要进入的项目文件更新更新包的引用。它通过在与 packages.config 相同的目录中查找所有 .csproj 文件(或您正在使用的任何项目文件风格)来实现这一点。如果这不会导致恰好 1 个文件,那么它会抛出一个异常,该异常随后被捕获并被忽略并且没有记录任何内容,所以你不是明智的。

希望这对以后的其他人有所帮助。也许是我。

我发现我 运行 遇到的问题是我的项目不在解决方案的同一目录树中。

给定解决方案文件时的 nuget.exe update 命令使用解决方案目录作为起点搜索 packages.config 文件,而不是查看解决方案中的每个项目文件。

来自nuget code on GitHub

string[] packagesConfigFiles = Directory.GetFiles(
         solutionDir, "*.config", SearchOption.AllDirectories);

您可以看到他们只是在寻找从解决方案目录开始的 *.config 文件。

我的项目和解决方案是这样组织的:

/Libraries/Shared/Shared.csproj
/Programs/NTService/NTService.csproj
/Programs/NTService.sln

在这种情况下,如果我 运行 更新 NTService.sln 文件,它只会更新 NTService.csproj 引用,因为它与 NTService.sln 文件。

因为它只查看整个树中的所有包,所以我只是将一个解决方案文件放在我存储库的根目录下,然后 运行 对其进行更新。该解决方案文件中有哪些项目并不重要。