[英]Different nuget-packages loaded when using MSBuild than building using Visual Studio
[英]MsBuild does not find restored NuGet-Packages on Visual Studio Online
我尝试在 Visual Studio Online 上构建存储在外部 GIT 存储库中的解决方案。
它有以下步骤:
1:Git 恢复 - 有效
2:NuGet 恢复 - 有效
3:构建 - 不起作用
查看日志时,我的第一个猜测是 MsBuild 没有在寻找 NuGet 存储它们的包。 NuGet Restore 中的一些行:
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
建立:
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=$( /p:ReferencePath=$(Build.StagingDirectory)\packages
Nuget-DestiantionDirectory: $(Build.StagingDirectory)\packages
(update3):我没有解决方案文件,但该存储库中只有一个 csproj 文件
问题是在项目内部有一个包的提示路径指向一个不在 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}"
,而 MSBuild 在设置"./packages"
时看起来并不递归作为源路径。
以上只是对遇到同样问题的未来人的解释
所以我的解决方案是模仿 nuget 的本地行为并更改输出目录以匹配存储库中的 HintPath(即使没有“AweCsome365Test”)目录:
(我会让这个问题悬而未决,因为这个解决方案闻起来有鱼腥味。如果有人有更好的解决方案,允许在不使用 HintPath 的情况下链接 nuget 和 msbuild,我很乐意将我的赏金花在它上面)
我相信您的 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”?
将 nuget 还原目标目录更改为 $(Build.SourcesDirectory)\packages 并删除 msbuild ReferencePath 参数。
这里的答案基本上是正确的。 但是,值得注意的是可能导致此行为的另一个原因。 我的工具链使用的是 Azure DevOps,它与 Visual Studio Online 基本相同,只是几年之后。
原因:
这样做是在安装包时使用包的解决方案位置。
对于 .Net 核心/标准项目,使用 Update-Package -reinstall 似乎可以解决问题。 但是,对于 .Net Framework 项目,即使packages.json
可能会重建, .csproj
中的<HintPath />
节点仍保持原样 - 引用 Azure 永远不会创建的包文件夹。
简单修复:
../../OtherRepo/packages
的提示路径(使用的斜线可能会有所不同),并将它们更改为../packages
这种方法将解决由从错误位置合并/更新包引起的问题,而不是需要更改构建管道来欺骗该位置(在可能的情况下,它也不能很好地工作)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.