DevOps Pipeline - не удается найти пакеты на этапе сборки - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь перенести существующее веб-приложение ASP.NET MVC из TeamCity в DevOps Azure, однако, похоже, у меня нет конвейера для поиска пакетов, которые он восстановил, из задачи восстановления пакета NuGet.

Решение имеет несколько проектов и использует большое количество пакетов NuGet. Я создал многошаговый конвейер, который в настоящее время имеет задачу восстановления NuGet и задачу построения VS.

Структура решения выглядит следующим образом:

\source
..\SolutionFolder
...Solution.sln
..\..\Project1
....Project1.csproj
..\..\Project2
....Project2.csproj
..\..\Packages
azure-pipelines.yaml
NuGet.config

Конвейер YAML выглядит следующим образом:

trigger:
- PipelineBranch

pool:
  vmImage: 'windows-latest'

stages:

## NuGet Restore ##
- stage: nuget_restore
  displayName: 'Restore nuget packages'
  jobs:
  - job: nuget_package_restore
    steps:
    - task: NuGetCommand@2
      displayName: 'NuGet restore'
      inputs:
        command: 'restore'
        restoreSolution: 'source/SolutionFolder/Solution.sln'
        feedsToUse: 'config'
        nugetConfigPath: 'NuGet.Config'
        restoreDirectory: '$(Build.SourcesDirectory)\source\SolutionFolder\packages'

## Build ##
- stage: build_for_int
  displayName: 'Build to int)'
  jobs:
  - job: run_build
    pool:
      vmImage: 'windows-latest'
    steps:
      - task: VSBuild@1
        displayName: 'Build Solution.sln (int)'
        inputs:
          solution: 'source/SolutionFolder/Solution.sln'
          msbuildArgs: '
          /p:DeployOnBuild=true 
          /p:WebPublishMethod=Package 
          /p:PackageAsSingleFile=true 
          /p:SkipInvalidConfigurations=true 
          /p:PackageLocation="$(Build.ArtifactStagingDirectory)"'
          platform: '$(BuildPlatform)'
          configuration: '$(BuildConfiguration)'

Когда конвейер запускает задачу восстановления, она успешно выдает следующие результаты:

<example package>

Added package 'postal.1.2.2' to folder 'd:\a\1\s\source\SolutionFolder\packages'

<loads more packages>

Installed:
    190 package(s) to packages.config projects

Когда задача компоновки запускается в решении, она завершается неудачно со следующей ошибкой в ​​первом проектеон встречает:

[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 "postal, Version=1.2.14706.0, Culture=neutral, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
...
Considered "d:\a\1\s\source\SolutionFolder\packages\postal.1.2.2\lib\postal.dll", but it didn't exist.

Та же ошибка возникает для каждой зависимости пакета. Похоже, задача восстановления пакета восстанавливает пакеты здесь:

d:\a\1\s\source\SolutionFolder\packages\

И в соответствии с журналом сборки ищет их здесь в иерархической структуре папок пакета, например:

d:\a\1\s\source\SolutionFolder\packages\<package>\<lib>\<dll>

Я пробовал несколько вещей, включая удаление параметра restoreDirectory из задачи восстановления, локальный запуск команды MSBuild (она работает) и удаление некоторых пакетов, однако я все еще вижу те же ошибки сборки.

Некоторые файлы проекта также содержат подсказки;например, в формате:

  <ItemGroup>
    <Reference Include="<some package>">
      <HintPath>..\packages\<package>\lib\<dll></HintPath>
    </Reference>

У кого-нибудь есть идеи? Спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

Вы должны включить задачи VSBuild @ 1 и NuGetCommand @ 2 в одно и то же задание .

Я проверил на своем локальном размещенном агенте и обнаружил второе задание, которое запускает задачу vsbuild , которая очистит рабочую папку и повторно загрузит исходный код, который удаляет папку пакетов, созданную первой задачей задания nugetcommand . Это может быть причиной, вызывающей ошибку.

Так что yaml конвейера должен выглядеть так:

    trigger:
    - PipelineBranch
    pool:
      vmImage: 'windows-latest'
    stages:
    ## NuGet Restore ##
    - stage: nuget_restore
      displayName: 'Restore nuget packages'
      jobs:
      - job: nuget_package_restore
        steps:
        - task: NuGetCommand@2
          displayName: 'NuGet restore'
          inputs:
            command: 'restore'
            restoreSolution: 'source/SolutionFolder/Solution.sln'
            feedsToUse: 'config'
            nugetConfigPath: 'NuGet.Config'
            restoreDirectory: '$(Build.SourcesDirectory)\source\SolutionFolder\packages'

        - task: VSBuild@1
          displayName: 'Build Solution.sln (int)'
          inputs:
            solution: 'source/SolutionFolder/Solution.sln'
            msbuildArgs: '
            /p:DeployOnBuild=true 
            /p:WebPublishMethod=Package 
            /p:PackageAsSingleFile=true 
            /p:SkipInvalidConfigurations=true 
            /p:PackageLocation="$(Build.ArtifactStagingDirectory)"'
            platform: '$(BuildPlatform)'
            configuration: '$(BuildConfiguration)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...