【问题标题】:Retrieving project version from csproj in Azure Pipeline .NET Core CLI task在 Azure Pipeline .NET Core CLI 任务中从 csproj 检索项目版本
【发布时间】:2021-02-20 20:55:54
【问题描述】:

我在 Azure DevOps 的 yaml 文件中有以下任务 它发布我的控制台应用程序并将其压缩到一个文件中

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/MyApp.csproj'
    arguments: '-r win-x64 -p:PublishSingleFile=True --self-contained true -o $(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

当我进行任何更改时,我直接在 Visual Studio 中的项目文件上设置项目版本。 现在,当我在 AzureDevOps 中发布项目并自定义文件名时,我正在尝试获取该版本,假设对于项目版本 1.2.1,在 azure 中发布的存档文件输出应该是 MyApp-v1.2.1.zip 目前它只输出文件为 MyApp.zip

不确定我的版本控制方法是否正确,因此感谢任何意见!

更新:

不幸的是,提供的答案对我不起作用,我可以获得版本但我无法重命名文件,即使复制下面的确切脚本也会产生相同的 zip 文件,而不是重命名!该文件夹将被重命名,但 zip 文件仍为 MyApp.zip。

我现在有以下脚本,最后尝试使用 PowerShell 重命名,但成功完成执行并再次在放置文件夹中生成完全相同的 MyApp.zip 文件


- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
         $xml = [Xml] (Get-Content .\MyApp\MyApp.csproj)
         $version = $xml.Project.PropertyGroup.Version
         echo $version
         echo "##vso[task.setvariable variable=version]$version"

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/MyApp.csproj'
    arguments: '-r win-x64 -p:PublishSingleFile=True --self-contained true -o $(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'
  condition: succeededOrFailed()
  
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: 'Rename-Item -Path "$(Build.ArtifactStagingDirectory)\MyApp.zip" -NewName "$(Build.ArtifactStagingDirectory)\MyApp-Win-x64-v$(version).zip"'

但是上面的脚本也不起作用,好像我们没有权限更改那个 zip 文件,不管我不能重命名它。

固定 - 解决方案

我不得不将重命名 power shell 脚本移到发布工件之前


- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
         $xml = [Xml] (Get-Content .\MyApp\MyApp.csproj)
         $version = $xml.Project.PropertyGroup.Version
         echo $version
         echo "##vso[task.setvariable variable=version]$version"

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/MyApp.csproj'
    arguments: '-r win-x64 -p:PublishSingleFile=True --self-contained true -o $(Build.ArtifactStagingDirectory)'

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: 'Rename-Item -Path "$(Build.ArtifactStagingDirectory)\MyApp.zip" -NewName "$(Build.ArtifactStagingDirectory)\MyApp-Win-x64-v$(version).zip"'


- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'
  condition: succeededOrFailed()
  

【问题讨论】:

    标签: azure-devops msbuild azure-pipelines dotnetcorecli


    【解决方案1】:

    要设置输出文件(zip 文件)的名称,需要在 dotnet build 参数中设置相应的格式。

    --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/MyApp-$(version)
    

    为了获取 csproj 文件中的 Version 值,您可以在 Dotnet Publish 任务之前添加一个 powershell 任务。然后你可以从 csproj 检索项目版本

    这是我的例子:

    - powershell: |
       $xml = [Xml] (Get-Content .\MyApp.csproj)
       $version = $xml.Project.PropertyGroup.Version
       
       echo $version
       
       echo "##vso[task.setvariable variable=version]$version"
      displayName: 'PowerShell Script'
    
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: publish
        publishWebProjects: false
        projects: '**/*.csproj'
        arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/MyApp-$(version)'
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
      condition: succeededOrFailed()
    

    结果:

    您也可以尝试将名称设置为$(build.artifactstagingdirectory)/MyApp-v$(version)

    输出名称将为MyApp-v1.0.0.zip

    更新:

    我已经在 Yaml Pipeline 中测试了您的示例,我可以重现此问题。

    为解决此问题,您可以在 Dotnet Publish 任务中添加参数:modifyOutputPath: false

    这里是 yaml 示例:

    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
             $xml = [Xml] (Get-Content .\MyApp\MyApp.csproj)
             $version = $xml.Project.PropertyGroup.Version
             echo $version
             echo "##vso[task.setvariable variable=version]$version"
    
    
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: publish
        publishWebProjects: false
        projects: '**/*.csproj'
        arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)/MyApp-v$(version)'
        modifyOutputPath: false
    
    
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
      condition: succeededOrFailed()
    

    【讨论】:

    • 哦,哇,伙计,非常感谢,我辛苦了,并在天蓝色的功能中编辑了它!但是您的方法是正确的方法!
    • 参数:'-r win-x64 -p:PublishSingleFile=True --self-contained true -o $(Build.ArtifactStagingDirectory)/MyApp-Win-x64-v$(version)'
    • 其实没关系,我修复了它,我必须在发布工件之前将 PowerShell 脚本移动到
    • 嗨@user65248。请参考我的更新。您只需要在 dotnet 发布任务中添加参数: modifyOutputPath: false 。然后它会正常工作。这可能是解决此问题的一种更简单的方法。
    • 啊,太好了,非常感谢您的更新!
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2020-10-05
    相关资源
    最近更新 更多