9

我正在使用 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

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

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

我仍然无法解决我的问题。任何帮助如何使perl6二进制文件可用PATH

已编辑

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

jobs:
- job: Windows
  pool:
    vmImage: 'vs2017-win2016'
  steps:
    - script: |
        call "C:\Program Files (x86)\Microsoft Visual Studio\2017\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 和 cmdline 中更改 PATH两次。但它仍然会引发以下错误:

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

有什么帮助吗?

4

3 回答 3

2

实际上,您非常接近正确的解决方案。您的第二个 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,但缺点setPATH值仅在当前命令行终端可用,并没有实际添加到系统变量中。这就是您在下一步中遇到无法识别的错误的原因script

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

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

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

于 2020-04-16T09:18:41.787 回答
1

为什么不这样做:

- script: |
  PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH perl6 -v
于 2019-10-06T10:42:01.897 回答
1

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

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

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

于 2020-11-19T13:13:52.417 回答