J'utilise Azure Pipelines pour créer un binaire Rakudo pour Raku (précédemment alias Perl 6) dans Windows.
C'est mon fichier azure-pipelines.yml
:
'perl6' is not recognized as an internal or external command, operable program or batch file.
Le script de pipeline construit perl6
binaire perl6
dans le $(Build.SourcesDirectory)/rakudo-win/bin
. Il y a en effet perl6.exe
dans $(Build.SourcesDirectory)/rakudo-win/bin
. Pour le rendre disponible, j'ai défini le chemin en l'ajoutant au début du script bash. Mais quand j'essaye d'exécuter la commande perl6 -v
, la construction échoue à cette étape.
J'ai recherché des problèmes similaires dans SO ici , ici , ici .
Je n'ai toujours pas pu résoudre mon problème. perl6
vous de l'aide pour rendre le binaire perl6
disponible sur PATH
?
ÉDITÉ
La prochaine chose que j'ai faite a été de créer un autre script .yml
comme suit:
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
et essayé de changer PATH deux fois une fois dans PowerShell et un autre dans cmdline. Mais toujours, il jette l'erreur suivante:
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
De l'aide?
3 Réponses :
pourquoi ne pas simplement faire ceci:
- script: | PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH perl6 -v
Une fois que perl6
est dans PATH, je veux exécuter ces commandes: git clone github.com/ugexe/zef.git , cd zef, perl6 -I. installation de bin / zef.
alors vous pouvez définir le chemin avec export PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH
et exécuter ces commandes
Désolé ça ne marche pas. L'erreur qu'il génère avec le dernier script de mon .yml
est /d/a/_temp/bd6b25db-74ec-40a1-90f3-0d0ef477f3df.sh: line 1: perl6: command not found
.
En fait, vous êtes très proche de la bonne solution. Votre deuxième tâche PowerShell a défini le PATH avec succès. Vous pouvez ajouter une autre tâche distincte pour imprimer la valeur PATH
système pour vérifier cela.
- pwsh: | $NewPathInRegistry = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path Write-Host $NewPathInRegistry
Pour définir le PATH
programmation, vous ne pouvez pas utiliser set
commande set
, cette commande peut en effet définir la variable d'environnement PATH
, mais l' inconvénient de set
est que la nouvelle valeur PATH
n'est disponible que dans le terminal de ligne de commande actuel, elle n'a pas été ajoutée en fait dans la variable système . C'est pourquoi vous obteniez une erreur non reconnue dans la prochaine action de script
.
Pour ajouter définitivement le répertoire à la variable d'environnement PATH
afin qu'il puisse fonctionner pour les autres étapes suivantes, vous devez utiliser setx
ou les ajouter dans le registre à l'aide de reg add
. Mais l'utilisation de setx a pour limite que la valeur PATH
dépasse pas 1024 caractères. Donc, ici, la meilleure solution consiste à mettre à jour PATH
en modifiant la valeur du Registre.
MAIS, la mise à jour du registre pose encore un autre problème, vous devez tuer le processus actuel et exécuter un nouveau processus pour exécuter perl6
afin qu'il puisse lire le nouveau paramètre de registre disponible.
Si vous exécutez stop-process
dans le pipeline Azure devops, la tâche échouera avec le code de sortie -1 . Il s'agit du code de sortie attendu, vous pouvez donc définir continueOnError: true
sur step afin que les étapes suivantes puissent continuer.
La meilleure méthode que j'ai trouvée pour définir le PATH pour les tâches suivantes dans Azure Pipelines consiste à utiliser la syntaxe de commande de journalisation mentionnée dans le premier des trois liens SO que vous avez examinés. Étant donné que vous utilisez PowerShell dans votre pipeline yaml mis à jour, la commande serait:
Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"
Notez que cela ne s'applique qu'aux tâches suivantes , si vous essayez de générer la variable PATH dans la tâche actuelle, elle ne sera pas mise à jour.
Ceci est juste une liste linéaire de commandes, pourquoi ne pas utiliser un fichier batch?
Je ne suis pas sûr, mais je pense que sur Win, le répertoire DOIT être
c:\rakudo
. Du moins, c'était le cas.Oui , je peux définir le répertoire comme
c:\rakudo
, dans ce cas , je dois avoirC:\rakudo\bin
dansPATH
, afin que je puisse utiliserperl6
en aval après lescript
s.