Пока у меня очень простой c конвейер сборки
# ASP.NET
# Build and test ASP.NET projects.
# Add steps that publish symbols, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4
trigger:
- testing-build-yml-1
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
# packagesDirectory: '..\packages'
restoreDirectory: '..\new_packages'
- task: VSBuild@1
inputs:
solution: '$(solution)'
#msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)" /p:ReferencePath="d:\a\1\new_packages"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
Я пытаюсь выполнить задачу Nuget Restore, чтобы восстановить пакеты в каталог ..\new_packages
, а затем надеюсь, что задача VSBuild получит оттуда и построим решение.
Восстановление Nuget выполняет следующую команду (все в одной строке)
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\bin\msbuild.exe
"C:\Users\VssAdministrator\AppData\Local\Temp\NuGetScratch\jgtjjpe0.nac.nugetinputs.targets"
/t:GenerateRestoreGraphFile
/nologo
/nr:false
/v:q
/p:NuGetRestoreTargets="C:\Users\VssAdministrator\AppData\Local\Temp\NuGetScratch\whba0xm4.c0f.nugetrestore.targets"
/p:RestoreUseCustomAfterTargets="True" /p:RestoreTaskAssemblyFile="C:\hostedtoolcache\windows\NuGet\5.4.0\x64\nuget.exe"
/p:RestoreSolutionDirectory="D:\a\1\s\\"
/p:RestoreConfigFile="D:\a\1\Nuget\tempNuGet_105.config"
/p:RestorePackagesPath="..\new_packages"
/p:SolutionDir="D:\a\1\s\\"
/p:SolutionName="XYZ"
Затем VSBuild Task запускает msbuild (все в одной строке)
##[command]"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe"
"D:\a\1\s\XYZ.sln"
/nologo
/nr:false
/dl:CentralLogger,
"D:\a\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda\1.161.2\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";
"RootDetailId=e5869970-8e7b-4a06-a8fd-f0662f639a6d|SolutionDir=D:\a\1\s"*ForwardingLogger,"D:\a\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda\1.161.2\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\new_packages"
/p:platform="Any CPU"
/p:configuration="Release"
/p:VisualStudioVersion="16.0"
/p:_MSDeployUserAgent="VSTS_607486bc-2d64-463d-9a7f-0cf06fe82263_build_16_0"
Решение ищет соответствующий каталог, указанный в /p:ReferencePath="d:\a\1\new_packages
.
Но он по-прежнему не может найти dll для пакетов Nuget, и в конечном итоге сборка завершается неудачей.
Building the projects in this solution one at a time. To enable parallel build, please add the "-m" switch.
Build started 1/9/2020 10:11:18 PM.
Project "D:\a\1\s\XYZ.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
Building solution configuration "Release|Any CPU".
Project "D:\a\1\s\XYZ.sln" (1) is building "D:\a\1\s\ServiceLayer\InputOutputServiceLayer.csproj" (2) on node 1 (default targets).
PrepareForBuild:
Creating directory "bin\Release\".
Creating directory "obj\Release\".
ResolveAssemblyReferences:
Primary reference "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL".
##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. [D:\a\1\s\ServiceLayer\InputOutputServiceLayer.csproj]
For SearchPath "d:\a\1\new_packages".
Considered "d:\a\1\new_packages\EPPlus.winmd", but it didn't exist.
Considered "d:\a\1\new_packages\EPPlus.dll", but it didn't exist.
Considered "d:\a\1\new_packages\EPPlus.exe", but it didn't exist.
For SearchPath "{HintPathFromItem}".
Considered "D:\a\1\s\packages\EPPlus.4.5.3.2\lib\net40\EPPlus.dll", but it didn't exist.
Технически я знаю, что мы не должны жестко кодировать /p:ReferencePath=..
do это, но я просто пытаюсь заставить его работать.
Без этого VSBuild Task, похоже, не знает, где вообще искать.
Это выглядит как
ResolveAssemblyReferences:
Primary reference "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL".
##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. [d:\a\1\s\ServiceLayer\InputOutputServiceLayer.csproj]
For SearchPath "..\d:\a\1\a".
Considered "..\d:\a\1\a\EPPlus.winmd", but it didn't exist.
Considered "..\d:\a\1\a\EPPlus.dll", but it didn't exist.
Considered "..\d:\a\1\a\EPPlus.exe", but it didn't exist.
For SearchPath "{HintPathFromItem}".
Considered "d:\a\1\s\packages\EPPlus.4.5.3.2\lib\net40\EPPlus.dll", but it didn't exist.
For SearchPath "{TargetFrameworkDirectory}".
Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\EPPlus.winmd", but it didn't exist.
Есть похожий вопрос, использующий старый способ использования конвейера
MsBuild не находит восстановленные пакеты NuGet на Visual Studio Online
Их решение (хотя и хакерское) у меня тоже не работает.
Если я удалю пакет EPPlus, следующий пакет Entity Framework
выдаст те же ошибки.
Если я удалю Entity Framework
, следующий пакет выдаст те же ошибки.
Я просто пытаюсь найти реальное решение для этого, которое не включает в себя эти хакерские программы (..и работает, очевидно)
РЕДАКТИРОВАТЬ:
Работает, со странностями благодаря Leo Liu-MSFT
.
Мой ответ ниже этого.