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\bindansPATH, afin que je puisse utiliserperl6en aval après lescripts.