Azure devops 在azure devops中从单个存储库发布多个nuget包

Azure devops 在azure devops中从单个存储库发布多个nuget包,azure-devops,repository,build-system,azure-artifacts,Azure Devops,Repository,Build System,Azure Artifacts,我正在使用Azure Devops,并且有一个包含多个项目的存储库: 核心:包含其他项目使用的模型 客户端:其他项目使用的库 Azure:特定于平台的实现 目前我有一个构建,它打包了所有3个项目,并将它们推送到Azure工件提要上。但是,当3个项目中的一个没有更改时,会出现一个问题:构建失败。这是正常的,因为构建尝试推送源中已经有版本号的包,而源不允许这样做 我认为没有办法检查提要中的包更改或现有版本,而忽略包或推送。是否有其他方法可以使没有更改的项目不打包/推送到提要上?您可以使用rest

我正在使用Azure Devops,并且有一个包含多个项目的存储库:

  • 核心:包含其他项目使用的模型
  • 客户端:其他项目使用的库
  • Azure:特定于平台的实现
目前我有一个构建,它打包了所有3个项目,并将它们推送到Azure工件提要上。但是,当3个项目中的一个没有更改时,会出现一个问题:构建失败。这是正常的,因为构建尝试推送源中已经有版本号的包,而源不允许这样做

我认为没有办法检查提要中的包更改或现有版本,而忽略包或推送。是否有其他方法可以使没有更改的项目不打包/推送到提要上?

您可以使用rest api获取有更改的项目,然后只生成有更改的项目。假设您的核心项目位于核心文件夹中,客户端位于客户端文件夹中,Azure位于Azure文件夹中。请检查以下示例:

  - job: Build
    pool:
      vmImage: 'windows-latest'
    steps: 
    - powershell: |
        $url="$(System.CollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/commits/$(Build.SourceVersion)/changes?api-version=5.1"
        $result = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method GET

        $changesFolder = $result.changes | Where-Object{$_.item.gitObjectType -match "tree"} | Select-Object -Property {$_.item.path}

        foreach($path in $changesFolder){
          if($path -match '/Client'){
            echo "##vso[task.setvariable variable=Client;isOutput=true]$True"
            break
          }
        }

        foreach($path in $changesFolder){
          if($path -match '/Core'){
            echo "##vso[task.setvariable variable=Core;isOutput=true]$True"
            break
          }

        foreach($path in $changesFolder){
          if($path -match '/Azure'){
            echo "##vso[task.setvariable variable=Azure;isOutput=true]$True"
            break
          }
        }
      name: MyVariable

    - task: VSBuild@1
      condition: eq(variables['MyVariable.Core'], 'true')
      name: buildCore
      ...
    - task: VSBuild@1
      condition: eq(variables['MyVariable.Azure'], 'true')
      name: buildAzure
      ...
    - task: VSBuild@1
      condition: eq(variables['MyVariable.Client'], 'true')  
      name: buildClient
      ...
在上面的示例管道中,我有一个powershell任务,它调用RESTAPI来获取更改的路径。然后我定义变量
Client
,如果客户机文件夹发生更改,则将其值设置为true,并对Core和Azure文件夹执行相同的操作

在以下任务中,我有三个VSBuild任务分别用于构建项目。对于每个VSbuild任务,我都设置了一个检查相应变量是否为true的参数,如果不是true,则将跳过该参数以运行。例如,如果Azure项目没有更改,则变量Azure将为null,并且生成Azure项目的VSbuild任务将被跳过

通过上述管道,只有这些有变化的项目才会被构建并推送到您的提要中

另一个解决方法是创建多个管道(例如客户端管道、核心管道、azure管道),分别构建和推送不同的项目。在这些管道中,使用客户机管道来构建客户机项目。只有在客户端项目中发生更改时,才会触发此管道

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - Client/*
    exclude:
    - Azure/*
    - Core/*

希望以上帮助

这很有帮助。我刚刚开始在管道中使用更复杂的解决方案,这些案例对我来说真的很头疼,因为我是管道和api的初学者。谢谢