【问题标题】:nuget command line update doesn't detect all packages.config which need to be updatednuget 命令行更新未检测到所有需要更新的 packages.config
【发布时间】:2016-02-10 08:28:31
【问题描述】:

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

【问题讨论】:

    标签: nuget teamcity nuget-update


    【解决方案1】:

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

    希望这将在未来对其他人有所帮助。也许是我。

    【讨论】:

    • 这是有用的信息,但就我而言,我只有一个 .csproj 文件,并且该项目与并行文件夹中的其他项目完全没有区别。它甚至会更新 packages.config 文件,但不会更新 .csproj 文件,而且我的参考资料已损坏。有什么建议吗?
    • 忽略我之前的评论,我被愚弄了,我正在从错误的目录中查看 packages.config。 csproj 没有更新,因为它的 packages.config(真正的)已经填充了版本(并且它是最新的可用包版本)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我也遇到了这个问题,但是我无法移动 .sln 文件,所以我不得不在我的更新脚本中为这些项目添加单独的 nuget update 调用。但是花了一段时间才知道发生了什么,它应该从 .sln 文件中获取项目(这样不仅可以避免问题,而且每次搜索文件夹也节省了大量时间)。
    • @P.W.就像我在评论中提到的那样,您只需要在根目录中有一个解决方案文件。您无需将解决方案移至根目录。我同意它应该只查看解决方案中的项目。
    猜你喜欢
    • 2011-10-16
    • 2014-05-29
    • 2018-04-11
    • 2015-04-03
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多