在 Azure Pipeline .NET Core CLI 任务中从 csproj 检索项目版本

如何解决在 Azure Pipeline .NET Core CLI 任务中从 csproj 检索项目版本

我在 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,天蓝色发布的存档文件输出应为 MyApp-v1.2.1.zip 目前它只输出文件为 MyApp.zip

不确定我的版本控制方法是否正确,所以感谢任何输入!

更新:

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

我现在有以下脚本,最后尝试使用 PowerShell 重命名,但成功完成执行并再次在 drop 文件夹中生成完全相同的 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()
  

解决方法

要设置输出文件的名称(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()

结果:

enter image description here

您也可以尝试将名称设置为$(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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?