在 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 变量,它将不会更新。
我正在使用 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 的最佳方法是使用您查看的
Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"
请注意,这仅适用于后续 任务,如果您尝试在当前任务中输出 PATH 变量,它将不会更新。