【问题标题】:Newtonsoft.Json.dll being copied from wrong location in the build server从构建服务器中的错误位置复制 Newtonsoft.Json.dll
【发布时间】:2025-12-19 12:35:10
【问题描述】:

我在这里遇到了一些奇怪的问题,有一个在 Visual Studio 中正常构建的软件,所有引用都使用 NuGet 添加,Newtonsoft.Json.dll 位于包文件夹中,并且引用指向该文件夹。

在构建服务器中构建时,我们注意到测试失败,进一步我们发现实际上复制的 Newtonsoft.Json.dll 是错误的,来自 Blend 文件夹。

来自构建日志:

从“D:\APPS\Microsoft Visual Studio”复制文件 12.0\Blend\Newtonsoft.Json.dll”到“D:\TB\2\PLWRO-WebPP\WebPP-Main-Dev-CI\bin\Newtonsoft.Json.dll”。

为了解决这个问题,我从 blend 文件夹中将 Newtonsoft.Json.dll 重命名为另一件事,然后构建按预期正常工作。

我的问题是,为什么?!?!?似乎构建是在 Blend 文件夹中而不是在提示路径中的设置位置中寻找参考 - 见下文。

<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>

【问题讨论】:

    标签: c# reference json.net blend build-server


    【解决方案1】:

    您可以尝试在 HintPath 元素之后添加 &lt;private&gt;true&lt;/private&gt; 元素。这应该强制复制到本地目录。

    有趣的另一部分是,您正在寻找旧版本 (v4.5.0.0),同时在您的包中引用新版本 (7.0.1)。

    在 Visual Studio 中,您可以尝试要求 Nuget 更新此库对 7.x 的引用,然后查看这是否有助于 MSBuild 从更具体的位置提取库。

    【讨论】:

    • 实际上 v4.5.0.0 指的是正确的包,如果您尝试添加包,您也会在“包含”中看到该版本。为什么“私人”作为“真实”应该有效?为什么这应该只对这个包有所不同?