web-dev-qa-db-fra.com

Pourquoi une étape post-génération (xcopy) se termine-t-elle de temps en temps avec le code 2 dans une version TeamCity?

Certains projets de la solution de mon client ont un événement post-génération: xcopy la sortie de la génération dans un dossier spécifique. Cela fonctionne bien lors de la construction locale. Cependant, dans TeamCity, je occasionnellement obtenir

xcopy [...] est sorti avec le code 2

Si j'utilise copy ordinaire, il se termine avec le code 1. Je suppose que cela a quelque chose à voir avec les verrous de fichiers, bien que les fichiers spécifiques en cours de copie ne soient pas les mêmes. Il est donc possible de simplement verrouiller le répertoire de destination partagé. J'utilise /y pour ne pas demander d’écraser des fichiers.

Pourquoi cela échoue dans TeamCity mais pas localement?

87
Tim Iles

Même si vous fournissez le /Y _ switch avec xcopy, vous obtiendrez toujours une erreur si xcopy ne sait pas si ce que vous copiez est un fichier ou un répertoire. Cette erreur apparaîtra comme "quitté avec le code 2". Lorsque vous exécutez la même commande xcopy à une invite de commande, vous verrez que xcopy demande une réponse pour un fichier ou un répertoire.

Pour résoudre ce problème avec une génération automatisée, vous pouvez faire écho dans une réponse prédéfinie avec un tuyau.

Pour dire que la chose que vous copiez est un fichier, echo dans F:

echo F|xcopy /y ...

Pour dire que la chose que vous copiez est un répertoire, echo dans D:

echo D|xcopy /y ...

Parfois, ce qui précède peut être résolu en utilisant simplement une commande de copie au lieu de xcopy:

copy /y ...

Cependant, s'il existe des répertoires inexistants menant à la destination finale du fichier, un "exit avec le code 1" se produira.

Rappelez-vous: utilisez le /C switch et xcopy avec prudence.

134
Metro Smurf

J'ai corrigé le code d'erreur 2 en ajoutant un\à la fin de mon chemin, sans cela, xcopy pensera que c'est un fichier plutôt qu'un dossier.

34
Benjiko99

Si vous utilisez xcopy dans un événement post-génération, utilisez le commutateur/Y en plus du/C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.
31
DavidS

Mon correctif pour ce problème était d'aller dans le dossier bin cible et de m'assurer que le sous-dossier approprié y existe. Une fois ce sous-dossier créé manuellement, le processus de génération s’est terminé avec succès.

2
boomer57

Vous utilisez probablement TeamCity avec git. Si oui, vérifiez que dossiers que vous voulez copier existe dans le référentiel git. Généralement, git aviod ajoute des dossiers de projet vides au référentiel. Ainsi, xcopy ne parvient pas à le trouver et génère une erreur.

Vous pouvez ajouter un fichier texte vide dans un dossier vide, valider et voir que le dossier apparaît dans le référentiel.

1
iliya

copy l'a corrigé pour moi. xcopy with /c /y n'a pas fonctionné. J'avais une sortie 4 alors je suis allé avec xcopy, mais il s'est avéré qu'il me fallait des citations autour de ($TargetPath).

Mon script:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"
1
Matt