在具有YAML文件格式的Azure DevOps上进行CI时,我试图读取csproj文件以提取有关版本的信息,以创建将遵循csproj版本的NuGet程序包。
我正在使用NuGetCommand@2
进行包装(由于versioningScheme: byPrereleaseNumber
)
是否有内置任务或一种方法可以从csproj文件中提取此信息作为正则表达式并将其传递给NuGetCommand@2
?
答案 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)
您可以将其添加为提取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文件似乎确实很麻烦,但一无所获...希望我们会得到一些适合于此类的更好的管道任务/变量将来的项目。