在 Windows 中的 azure 管道中设置 PATH

set PATH in azure pipelines in Windows

我正在使用 Azure Pipelines 在 Windows 中为 Raku(以前称为 Perl 6)构建 Rakudo 二进制文件。

这是我的 azure-pipelines.yml 文件:

jobs:
- job: Windows
  pool:
    vmImage: 'vs2017-win2016'
  steps:
    - bash: |
        mkdir -p $(Build.SourcesDirectory)/rakudo-win
        curl -L https://github.com/rakudo/rakudo/releases/download/2019.07.1/rakudo-2019.07.1.tar.gz | tar xz
        mv rakudo-2019.07.1 rakudo
        cd rakudo
        C:/Strawberry/perl/bin/perl Configure.pl --gen-moar --gen-nqp --backends=moar --prefix=$(Build.SourcesDirectory)/rakudo-win
        make
        make install

    - bash: |
        echo "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"

    - bash: |
        perl6 -v

管道脚本在 $(Build.SourcesDirectory)/rakudo-win/bin 文件夹中构建 perl6 二进制文件。 $(Build.SourcesDirectory)/rakudo-win/bin里面确实有perl6.exe。为了使其可用,我通过在 bash 脚本中添加路径来设置路径。但是当我尝试 运行 命令 perl6 -v 时,构建在这一步失败。

我在 SO , , 中搜索了类似的问题。

仍然无法解决我的问题。关于如何在 PATH 上提供 perl6 二进制文件的任何帮助?

已编辑

接下来我做的是创建另一个 .yml 脚本,如下所示:

jobs:
- job: Windows
  pool:
    vmImage: 'vs2017-win2016'
  steps:
    - script: |
        call "C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
    - pwsh: |
        mkdir -p C:\rakudo-win
        Invoke-WebRequest -Uri "https://github.com/rakudo/rakudo/releases/download/2019.07.1/rakudo-2019.07.1.tar.gz" -OutFile "rakudo.tar.gz"
        tar -xvf .\rakudo.tar.gz
        cd rakudo-2019.07.1
        C:\Strawberry\perl\bin\perl Configure.pl --gen-moar --gen-nqp --backends=moar --prefix=C:\rakudo-win
        make
        make install
    - pwsh: |
        $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
        $newpath = "C:\rakudo-win\bin;$oldpath" 
        Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newpath
    - script: |
        SET PATH=C:\rakudo-win\bin;%PATH%

    - script: |
        perl6 -v

并尝试在 powershell 中更改 PATH 两次,在 cmdline 中更改一次。但它仍然抛出以下错误:

'perl6' is not recognized as an internal or external command,
operable program or batch file.

有什么帮助吗?

为什么不这样做:

- script: |
  PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH perl6 -v

事实上,您已经非常接近正确的解决方案了。您的第二个 powershell 任务已成功设置 PATH。您可以添加另一个单独的任务来打印出系统 PATH 值来验证这一点。

- pwsh: |
    $NewPathInRegistry = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
    Write-Host $NewPathInRegistry


编程设置PATH,不能使用set命令,这个命令确实可以设置环境变量PATH,但是缺点[= set 的 44=] 是新的 PATH 值,仅在当前命令行终端中可用,实际上并未添加到 系统变量 中。这就是为什么您在下一步 script 中遇到无法识别的错误。

要将目录永久添加到环境变量 PATH 以便它可以用于接下来的其他步骤,您需要使用 setx 或将它们添加到 注册表 通过使用 reg add。但是 setx 的用法有限制,即 PATH 值最大为 1024 个字符。因此,这里最好的解决方案是通过修改注册表值来更新 PATH

但是,更新注册表还有另一个问题,您必须杀死当前进程和 运行 一个新进程到 运行 perl6 以便它可以读取新的可用注册表设置。

如果在 Azure devops 管道中 运行 stop-process,它将使任务失败,退出代码为 -1。这是预期的退出代码,因此您可以将 continueOnError: true 设置为 step 以便可以继续执行后续步骤。

我发现为 Azure Pipelines 中的后续任务设置 PATH 的最佳方法是使用您查看的 中提到的日志记录命令语法。由于您在更新的 yaml 管道中使用 PowerShell,因此命令为:

Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"

请注意,这仅适用于后续 任务,如果您尝试在当前任务中输出 PATH 变量,它将不会更新。