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

时间:2015-11-09 16:16:01

标签: nuget teamcity nuget-update

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

当我运行此命令时:

.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文件?或者任何有助于追踪此问题的内容?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

给定解决方案文件时,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文件上运行update,它将只更新NTService.csproj引用,因为它与NTService.sln文件位于同一目录树中。

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