是否可以从Azure DevOps YAML读取文件?

时间:2019-02-05 19:24:33

标签: azure-devops yaml csproj

在具有YAML文件格式的Azure DevOps上进行CI时,我试图读取csproj文件以提取有关版本的信息,以创建将遵循csproj版本的NuGet程序包。

我正在使用NuGetCommand@2进行包装(由于versioningScheme: byPrereleaseNumber

是否有内置任务或一种方法可以从csproj文件中提取此信息作为正则表达式并将其传递给NuGetCommand@2

3 个答案:

答案 0 :(得分:2)

我相当确定这没有内置的功能,但是您可以使用任何您喜欢的脚本语言来解析文件,并将所需的内容“吐出”作为构建变量并在以后使用。这是我一直在做的:

- script: echo "##vso[task.setvariable variable=dp]$(cat $(Build.Repository.LocalPath)/deployment/dp)"
- script: az group delete -n $(dp)-k8s -y --no-wait

您显然可以在脚本步骤中执行任何自定义操作,并以您希望的任何方式使用结果。

https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/authoring/commands.md

答案 1 :(得分:1)

基于Linux的代理解决方案

您可以将其添加为提取csproj标记的第一步:

- script: echo "##vso[task.setvariable variable=version]$(cat 'ProjectDirectory/MyProject.csproj' | grep -oP '(?<=<Version>).*?(?=<\/Version>)')"

然后,您可以通过在Yaml中的任意位置调用$(version)来使用它。

说明:

  • echo "##vso[task.setvariable variable=version]的意思是“设置一个我以后可以使用的变量”
  • cat 'ProjectDirectory/MyProject.csproj' | grep获取您的csproj内容,然后将其传递给grep,以便我们可以对其执行正则表达式
  • (?<=<Version>).*?(?=<\/Version>)')是一个正则表达式,可找到<Version>x.x.x</Version>标签而不使用这些标签,因此仅打印其中的内容

答案 2 :(得分:1)

这里的其他答案对我不起作用,但是我在管道定义中拼凑了一个替代解决方案:

variables:
  projectVersion: '0.0'
  buildNumber: '$(Build.BuildId)'
  versionNumber: '$(projectVersion).$(buildNumber)'

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $input_path = (Get-ChildItem -Path "YourDirectory\" -Include SampleLibrary.csproj -File -Recurse -ErrorAction SilentlyContinue)
      $regex = '(?<=<Version>).*?(?=<\/Version>)'
      $version = Select-String -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }
      Write-Output "##vso[task.setvariable variable=projectVersion]$version"

这会将版本号设置为一个不错的值,例如“ 1.1.8.547”,尽管显然您可以根据需要省略内部版本号。

PowerShell脚本的要点在于,它将首先在指定目录中检索.csproj文件。然后,我使用Francoimora发布的同一个正则表达式将值拉出文件,并将其存储在$ version变量中。最后一行将$ version的值写入YAML中定义的projectVersion变量。

从.NET Standard中的类库中删除AssemblyInfo.cs文件似乎确实很麻烦,但一无所获...希望我们会得到一些适合于此类的更好的管道任务/变量将来的项目。