【问题标题】:Is there a way to read file from Azure DevOps YAML?有没有办法从 Azure DevOps YAML 读取文件?
【发布时间】:2019-06-29 16:47:23
【问题描述】:

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

我使用NuGetCommand@2 进行包装(因为versioningScheme: byPrereleaseNumber

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

【问题讨论】:

    标签: azure-devops yaml csproj


    【解决方案1】:

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

    - 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

    【讨论】:

    • 好的,有时间我会尝试在js中做这个
    • 好问题,也需要同样的问题 - 你有没有得到任何地方,可以发布一个示例以从 csproj 中提取major.minor.patch 版本信息?
    【解决方案2】:

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

    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 文件似乎真的很麻烦,而且没有任何收获……希望我们能得到一些更好的管道任务/变量,这些任务/变量适合这些类型未来的项目。

    【讨论】:

      【解决方案3】:

      基于 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,以便我们可以对其执行正则表达式
      • (?&lt;=&lt;Version&gt;).*?(?=&lt;\/Version&gt;)') 是一个正则表达式,它找到 &lt;Version&gt;x.x.x&lt;/Version&gt; 标签而不消耗标签,所以它只打印里面的内容

      【讨论】:

      • 试过了,但构建失败并出现以下错误:grep: -P supports only unibyte and UTF-8 locales
      • 您是在基于 linux 的构建代理中吗?
      • 是的,此解决方案适用于基于 linux 的代理。我会把它添加到我的帖子中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多