【问题标题】:MsBuild does not find restored NuGet-Packages on Visual Studio OnlineMsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包
【发布时间】:2018-08-23 13:54:13
【问题描述】:

我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案。

它有以下步骤:

1:Git 恢复 - 工作

2:NuGet 恢复 - 工作

3:构建 - 不起作用

查看日志时,我的第一个猜测是 MsBuild 不是在寻找 NuGet 存储它们的包。 NuGet 还原中的一些行:

2018-03-14T21:10:11.0352862Z Completed installation of AngleSharp 0.9.9
2018-03-14T21:10:11.0353230Z Adding package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0353563Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0354972Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages' from source 'https://api.nuget.org/v3/index.json' 'Microsoft.SharePointOnline.CSOM.16.1.7317.1200' to folder 'D:\a\1\s\packages' 

MsBuild 中的一些代码:

018-03-14T21:10:21.2105399Z PrepareForBuild:
2018-03-14T21:10:21.2105793Z   Creating directory "bin\Release\".
2018-03-14T21:10:21.2424947Z   Creating directory "obj\Release\".
2018-03-14T21:10:30.3569560Z ResolveAssemblyReferences:
2018-03-14T21:10:30.3570425Z   Primary reference "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL".
2018-03-14T21:10:30.3670272Z ##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2041,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

我的解决方案/包结构是:

....\mysolution\myproject\myproject.csproj
....\mysolution\myproject\packages.config

当前配置: 那么如何更改 Nuget 和/或 msbuild-behavior 以使其正常工作?

(更新):澄清一下:每个包都有这个问题。它们都在packages.config中,每个都是从Nuget下载的,但每个都不是从MsBuild中找到的

(Update2) 目前生成的命令如下: NUGET:

D:\a\_tool\NuGet\4.4.1\x64\nuget.exe restore D:\a\1\s\AweCsomeO365\packages.config -PackagesDirectory D:\a\1\a\packages -Verbosity Detailed -NonInteractive -ConfigFile D:\a\1\Nuget\tempNuGet_22.config

MSBUILD:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe" "D:\a\1\s\AweCsomeO365\AweCsomeO365.csproj" /nologo /nr:false /dl:CentralLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=(GUID)|SolutionDir=D:\a\1\s\AweCsomeO365"*ForwardingLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=D:\a\1\a /p:ReferencePath=D:\a\1\a\packages /p:platform="anyCPU" /p:configuration="Release" /p:VisualStudioVersion="15.0" /p:_MSDeployUserAgent="VSTS_(GUID)_build_4_22

我替换了 GUID; tempNuGetConfig 似乎是由 VSTS 动态生成的东西

还是。即使日志指出 nuget 存储包

Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\a\packages'

MsBuild 似乎没有在那里找到它们:

 For SearchPath "D:\a\1\a\packages".
2018-03-16T13:57:42.4625155Z           Considered "D:\a\1\a\packages\AngleSharp.winmd", but it didn't exist.
2018-03-16T13:57:42.4625456Z           Considered "D:\a\1\a\packages\AngleSharp.dll", but it didn't exist.
2018-03-16T13:57:42.4625730Z           Considered "D:\a\1\a\packages\AngleSharp.exe", but it didn't exist.

VSTS-配置值:

MsBuild:/p:ReferencePath=$(Build.StagingDirectory)\packages

Nuget-DestiantionDirectory:$(Build.StagingDirectory)\packages

(update3):我有没有解决方案文件,但该存储库中只有一个 csproj 文件

【问题讨论】:

  • 那么,您是否在 NuGet 输出中给出了“添加的包 ... AngleSharp ...”?这不是您发布的 3 行中的任何一行
  • 看起来您的 packages.config 没有引用 AngleSharp
  • 这里可以显示myproject.csproj的内容吗?
  • AngleSharp 只是一个例子。我对每个包都有这个问题:Nuget 下载,但 MSBuild 找不到
  • 我相信你应该有一个解决方案文件。尝试添加一个,然后更改您的构建以引用该解决方案。您似乎还对所有内容使用了默认配置,因此无需为您的 nuget restore 任务定义所有配置。在添加要构建的解决方案后,我会删除它并重新添加原始任务。

标签: c# msbuild nuget azure-devops


【解决方案1】:

我认为您的 MSBuild“ReferencePath”参数不正确。您告诉 MS Build 您的所有引用(包括 nuget 包及其 dll)都将位于“D:\a\1\a\packages”,但这不是 nuget 下载和存储包和 dll 的地方。 Nuget 会将文件下载并解压到 D:\a\1\a\packages\{packageName}\{version}\lib\{environment}\package.dll 中。我认为您需要从 MSBuild 参数中删除最后一个参数 (ReferencePath)。

我还注意到您的 PackageLocation 参数与 NuGet 还原任务的目标不同,您是否需要像还原任务中的目标一样将“\packages”添加到该参数?

【讨论】:

  • 我添加了这个参数,因为没有它,它会看到一个完全不同的位置 (D:\a\1\s)(s 而不是 a)。所以去掉这个参数是行不通的
  • 我注意到有其他事情要调查,答案已更新。
【解决方案2】:

将 nuget 还原目标目录更改为 $(Build.SourcesDirectory)\packages 并删除 msbuild ReferencePath 参数。

【讨论】:

  • 这会将 nuget 包位置更改为“D:\a\1\s\packages”而不是“D:\a\1\a\packages”,但 nuget 仍然没有成功
  • (对不起:“MSBUILD 没有成功”是我的意思)
  • 它可能正在寻找 $(Build.SourcesDirectory)\AweCsome365Test\packages。我很确定如果您没有将参数传递给 MSBUILD,它查看的默认路径是该 \s\ 路径中的某个位置。
【解决方案3】:

问题是在项目内部有一个提示路径,用于指向不在 GIT-Repository 内(也不应该)的位置的包:

  <Reference Include="AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
      <HintPath>..\..\AweCsome365Test\packages\AngleSharp.0.9.9\lib\net45\AngleSharp.dll</HintPath>
    </Reference>

我最初的方法是为 NuGet 定义一个目标目录,并为 MSBuild 定义一个源目录,以将 另一个 位置用于两者都可以理解的包。

但问题(据我了解)是,NuGet 总是创建一个子文件夹结构 "./packages/{PackagesName}/lib/net45/{file}" 并且在将 "./packages" 设置为源路径时 MSBuild 看起来并不递归。

以上只是对未来遇到同样问题的人的解释

所以我的解决方案是模仿 nuget 的本地行为并更改输出目录以匹配存储库中的 HintPath(即使没有“AweCsome365Test”)目录:

(我将保留这个问题,因为这个解决方案闻起来很可疑。如果有人有更好的解决方案,允许在不使用 HintPath 的情况下链接 nuget 和 msbuild,我很乐意为此花费我的赏金)

【讨论】:

    【解决方案4】:

    这里的答案基本上是正确的。然而,值得注意的是另一个可能导致这种行为的原因。我的工具链使用的是 Azure DevOps,它与 Visual Studio Online 基本相同,只是几年后。

    原因:

    • 从不同的解决方案(交叉存储库)引用您的项目,例如用于调试目的
    • 从您引用它的外部位置更新有问题项目中的 NuGet 引用

    这样做是在安装包时使用包的 solution 位置。

    对于 .Net 核心/标准项目,使用 Update-Package -reinstall 似乎可以解决问题。但是,对于 .Net Framework 项目,即使 packages.json 可能会被重建,.csproj 中的 &lt;HintPath /&gt; 节点仍保持原样 - 引用 Azure 永远不会创建的包文件夹。

    简单修复:

    1. 在本地右键单击有问题的解决方案,然后选择 卸载
    2. 右键点击卸载的项目,选择edit .csproj
    3. 找到任何类似于../../OtherRepo/packages 的提示路径(使用的斜线可能会有所不同),并将它们更改为../packages
    4. 确认解决方案仍然在本地构建
    5. 将更改推送到 Azure,然后用手指交叉

    这种方法将解决由于从错误位置整合/更新软件包而导致的问题,而不是需要更改构建管道来欺骗该位置(在可能的情况下,这也不是很好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2014-11-10
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多