Sum*_*nal 6 rakudo azure-devops azure-pipelines raku
我正在使用Azure Pipelines 在Windows中为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
Run Code Online (Sandbox Code Playgroud)
管道脚本perl6
在$(Build.SourcesDirectory)/rakudo-win/bin
文件夹内构建了二进制文件。perl6.exe
里面确实有$(Build.SourcesDirectory)/rakudo-win/bin
。为了使其可用,我通过在bash脚本中添加路径来设置路径。但是,当我尝试运行command时perl6 -v
,此步骤构建失败。
我仍然无法解决我的问题。任何有关如何使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
Run Code Online (Sandbox Code Playgroud)
并尝试在powershell中两次更改PATH,在cmdline中两次更改PATH。但是仍然会引发以下错误:
'perl6' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?
小智 12
我发现在 Azure Pipelines 中为后续任务设置 PATH 的最佳方法是使用您查看的三个 SO 链接中第一个中提到的日志记录命令语法。由于您在更新的 yaml 管道中使用 PowerShell,因此命令将是:
Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于后续任务,如果您尝试在当前任务中输出 PATH 变量,它将不会更新。
事实上,您已经非常接近正确的解决方案了。您的第二个 powershell 任务已成功设置 PATH。您可以添加另一个单独的任务来打印系统PATH
值来验证这一点。
- pwsh: |
$NewPathInRegistry = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
Write-Host $NewPathInRegistry
Run Code Online (Sandbox Code Playgroud)
要以编程方式设置PATH
,不能使用set
命令,该命令确实可以设置环境变量PATH
,但缺点是set
新PATH
值只能在当前命令行终端中使用,它实际上并没有被添加到系统变量中。这就是您在下一步中遇到无法识别的错误的原因script
。
要将目录永久添加到环境变量中PATH
以便它可以用于接下来的其他步骤,您需要使用setx
它们或通过使用将它们添加到注册表reg add
中。但setx的使用有限制,其PATH
值最大为1024个字符。所以,这里最好的解决方案是PATH
通过修改注册表值进行更新。
但是,更新注册表仍然存在另一个问题,您必须终止当前进程并运行一个新进程来运行,perl6
以便它可以读取新的可用注册表设置。
如果stop-process
在 Azure DevOps 管道中运行,则会导致任务失败并退出代码-1。这是预期的退出代码,因此您可以将其设置continueOnError: true
为步骤,以便可以继续后续步骤。
归档时间: |
|
查看次数: |
196 次 |
最近记录: |