1

我们有一个构建步骤,用于在构建服务器 (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 文件吗?或者任何可能有助于追踪这个问题的东西?

4

2 回答 2

1

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

希望这将有助于将来的其他人。也许我。

于 2015-11-09T16:43:59.737 回答
1

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

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

GitHub 上的 nuget 代码

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 文件位于同一目录树中。

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

于 2016-09-14T19:00:03.190 回答