2
votes

La commande cp ne fonctionne pas dans Bash Script dans le pipeline de génération d'Azure Devops

J'ai besoin de copier le dossier avec plusieurs fichiers dans un autre dossier dans le pipeline de construction.

j'utilise

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory

et j'obtiens une erreur avec le code de sortie 126:

cp -R -v pathToSourceFolder pathToDestFolder

cp -R -v   /Users/runner/runners/2.166.4/work/1/s/en.lproj/  /Users/runner/runners/2.166.4/work/1/s/platforms/ios/AppName/Resources

Quelqu'un peut-il m'aider car je suis nouveau dans linux / macOS utilise / cmd? Remarque: le pipeline s'exécute sous macOS.


9 commentaires

Veuillez ne pas fournir de captures d'écran, sauf si cela est nécessaire pour la compréhension, mais postez la commande avec laquelle vous avez un problème sous forme de texte.


J'ai pensé que je ferais mieux d'afficher le problème ... devrais-je modifier la question?


Absolument. Si vous avez vraiment des photos chose aide, vous pouvez poster un lien vers une image en plus. À tout le moins, nous devons voir la commande, qui provoque l'erreur, sous forme de texte (afin qu'elle puisse être copiée et collée).


@ user1934428 est-il clair maintenant? pouvez-vous s'il vous plaît répondre à la question?


Je ne pense pas que votre répertoire s'appelle vraiment pathToSourceFolder . Vous devez publier la commande exactement telle qu'elle est écrite dans votre script shell.


pathToSourceFolder est juste un moyen de dire quel est le répertoire source monsieur


Oui, si vous ne dites pas les répertoires réels exactement comme vous les avez écrits, mais que nous ne voyons pas s'il contient des caractères spéciaux qui, s'ils ne sont pas correctement cités, pourraient provoquer l'erreur.


Continuons cette discussion en chat .


@ user1934428 Bonjour ami, veuillez envisager d'ajouter votre solution comme réponse car votre script fonctionne bien pour résoudre le problème d'origine. (Selon les dernières nouvelles de la salle de discussion ci-dessus ~) afin que les membres ayant un problème similaire puissent trouver facilement les informations utiles et nous peut archiver ce fil! Bonne journée :)


3 Réponses :


1
votes

J'ai besoin de copier le dossier avec plusieurs fichiers dans un autre dossier dans le pipeline de construction.

/Users/runner/runners/2.166.4/work/1/s suppose que /Users/runner/runners/2.166.4/work/1/s est le dossier de travail par défaut de votre build. Veuillez donc éviter de coder en dur le chemin, à la place, vous pouvez utiliser $(System.DefaultWorkingDirectory) qui représente ce chemin. Voir Variables prédéfinies Azure Devops.

Étant donné que votre objectif initial est de copier les fichiers dans le pipeline Azure Devops, vous n'avez pas besoin de vous soucier trop de la syntaxe de copie correspondante dans différents systèmes d'exploitation (Linux, MacOS ou Windows).

Vous pouvez faire ce que vous voulez facilement en utilisant la tâche officielle Copier les fichiers . Cette tâche nécessite trois entrées: le Source folder Target folder et le Contents nous voulons copier, c'est tout.

Format de l'interface utilisateur classique:

entrez la description de l'image ici

Vous pouvez choisir le dossier source via l'option Browse Source Folder . Et puis utilisez ** comme contenu, $(System.DefaultWorkingDirectory)/platforms/ios/Fixi/Resources comme dossier cible.

Format Yaml:

- task: CopyFiles@2
  displayName: 'My Copy Task'
  inputs:
    SourceFolder: en.lproj
    TargetFolder: '$(System.DefaultWorkingDirectory)/platforms/ios/Fixi/Resources'

Nous avons fait la logique derrière pour vous afin que vous puissiez utiliser cette tâche facilement sous MacOS / Linux / Windows. Journal de mon test:

entrez la description de l'image ici


4 commentaires

Merci pour vos suggestions. cela a aidé à écrire correctement les chemins.


@RageshPikalmunde Vous êtes les bienvenus! Et trouvez-vous la solution à votre problème après les commentaires ci-dessus? Si tel est le cas, pensez à l'ajouter comme réponse et à l' accepter . Il serait donc utile pour les autres membres qui rencontrent le même problème de trouver facilement la solution. Bonne journée:)


comme mentionné dans votre réponse ... il ne copie que les fichiers du dossier source vers le dossier cible ... non ?? Avons-nous la tâche de copier le dossier avec son fichier d'un emplacement à un autre comme je l'ai posé en question ou cette tâche fonctionne comme excepté? ci-dessus la réponse acceptée fonctionne ... Je veux juste savoir pour la connaissance personnelle.


@RageshPikalmunde Hmm, je pense que la tâche peut aussi le faire. Changez l'entrée du dossier cible en $(System.DefaultWorkingDirectory)/platforms/ios/Fixi/Resourc‌​es/en.lproj , puis la tâche copiera le contenu du dossier en.lproj (source) vers la cible en.lproj (sinon existe, la tâche le créera pour vous). Remarque: les fichiers sont copiés de manière récursive lors de l'utilisation de cette tâche. Ainsi, la tâche de copie de fichiers fonctionnera comme une «tâche de copie de dossier». J'espère que cela aide ~



2
votes

Comme il n'y a manifestement rien de mal dans la commande cp, j'écrirais simplement quelques contrôles de sécurité sur la présence des répertoires:

# Define directories involved
from="pathToSourceFolder"
to="pathToDestFolder"

# Check existence
if [[ -d "$from" ]]
then
  # If the destination directory does not exist, we create it.
  [[ -d $to ]] || mkdir -p "$to"
  if [[ -d $to ]]
  then
    cp -R -v "$from" "$to"
  else
    # If we get here, we will likely have permission problems.
    echo Can not create directory $to
    ls -ld "$to"
  fi
else
  echo Source directory $from does not exist
fi


0 commentaires

0
votes

Je sais que la réponse acceptée dit que la commande "cp" n'est pas interrompue, mais elle se trouve en fait dans les pipelines Azure. Microsoft semble ajouter un "/" à la fin par défaut, ce qui rompt le comportement de la commande.

si tu fais:

cp ./src/myfile.txt ./dest/myfile.txt/

il copiera les fichiers du dossier src vers le dossier dest.

si vous écrivez:

cp ./src/myfile.txt ./dest/myfile.txt

il copiera le dossier src dans celui de destination, vous laissant avec / dest / src / *

De plus, mon pipeline de construction a échoué lorsque j'ai essayé de copier un fichier

cp -r ./src ./dest/

L'ajout du "/" à la fin le fera échouer car il tente de vider le fichier dans un répertoire qui n'existe pas puisque la commande réelle qui s'exécute est la suivante.

cp -r ./src ./dest


0 commentaires