Pós-compilação saiu com o código 1


107

Tenho um projeto com um evento pós-construção:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

Funciona bem sempre na minha máquina. Tenho um novo desenvolvedor que sempre recebe o erro "saiu com o código 1". Eu fiz com que ela executasse o mesmo comando em um prompt do DOS e funcionou bem. O que poderia estar causando isso? Existe alguma maneira de chegar ao erro real?

Ambos estamos usando o Visual Studio 2008.


no meu caso, a resposta fornecida por Tim Scott perto do final desta página (portanto, esqueci no início) resolveu meu problema.
— yu yang Jian

Respostas:


115

Ela tinha um espaço em um dos nomes de pasta em seu caminho, e nenhuma aspas ao redor.


12
colocar aspas nos nomes dos caminhos é uma boa prática. não trabalhar em caminhos que contenham espaço é melhor :-)
— Asher

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" este comando não está funcionando para mim e se eu estiver escrevendo a saída 0 no final, então funciona bem. você pode me dizer por quê?
— Rikin Patel,

59

Aquele com os "Pings" me ajudou ... mas pode ser explicado um pouco melhor ...

Para mim, a solução foi mudar:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

para isso:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

Espero que funcione para você. :-)


47

Eu adicionei isso para futuros visitantes, pois esta é uma questão bastante ativa.

O ROBOCOPY sai com "códigos de sucesso" abaixo de 8. Consulte: http://support.microsoft.com/kb/954404

Isso significa que:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

Resolvi isso facilmente adicionando isso ao final do arquivo de lote

exit 0

Sugira que lidar com erros de ROBOCOPY desta forma

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

A confusão ocorrerá quando nenhum arquivo for copiado = nenhum erro no VS. Então, quando há mudanças, os arquivos são copiados, erros do VS, mas tudo o que o desenvolvedor queria foi feito.

Dica adicional: não use uma pausa no script, pois isso se tornaria uma pausa indefinida na construção do VS. ao desenvolver o script, use algo semelhante timeout 10. Você notará isso e comentará ao invés de ter uma construção suspensa.


4
É mesmo o que eu procurava. Obrigado!!
— Ricky

Batendo em uma resposta de 8 anos de idade para dizer que, se você quiser um arquivo one-liner, e não um arquivo bat, você pode adicionar um "& exit 0" no final da string de evento pós-construção.
— Eric Wu

46

Meu motivo para o Código 1 foi que a pasta de destino era somente leitura. Espero que isso ajude alguém! Eu tive um evento de pós-construção para fazer uma cópia de um diretório para outro e o destino era somente leitura. Então, desmarquei o atributo somente leitura no diretório e todos os seus subdiretórios! Apenas certifique-se de que é um diretório seguro para isso!


Me economizou uma hora, obrigado! Baixei algum código da Internet e o Windows 7 define a pasta como somente leitura automaticamente.
— Johan Petersson,

1
Eu também usei xcopy e com o sinalizador / y. Todos os comandos microsoft.com/resources/documentation/windows/xp/all/proddocs/…
— Johan Petersson


8

Tive que executar o VS como administrador para obter minha cópia pós-construção em um sistema operacional protegido ".. \ Common7 \ IDE \ PrivateAssemblies" para funcionar


5

Para aqueles que usam ' cópia ' comando na Build Events ( linha de comando evento pré-compilação ou / e linha de comando evento Post-Build ) do Projeto -> Propriedades : você ' copiar ' parâmetros de comando deve ser semelhante aqui: copy "source of files" "destination for files". Lembre-se de usar aspas (para evitar problemas com espaços em strings de endereço).


4

Eu tive um problema semelhante, mas especificamente em um ambiente de construção Jenkins. Para corrigir o problema, mudei de usar um comando de cópia no evento pós-compilação para usar um destino de cópia.

Eu mudei isso:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

para isso:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

e funciona bem agora.

O erro específico que estava recebendo era:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>

Como você fez essa mudança? Você editou isso manualmente? Como você executa o alvo? Parece algo que você precisa especificar na linha de comando do msbuild. Eu tenho exatamente o mesmo problema no meu ambiente jenkins, o que é estranho porque todas as pastas criadas pelo msbuild são sempre somente leitura. Por que ele copia bem na minha máquina, mas não no servidor, está além de mim.
— shawn1874

Acabei de usar o Notepad ++ para editar o arquivo csproj. O gancho "AfterBuild" é um gancho padrão, portanto, se existir, será chamado automaticamente após o processo de construção.
— TechSavvySam

Obrigado. Eu não tinha certeza se você tinha um arquivo msbuild personalizado com um destino ou se era apenas o arquivo criado pelo Visual Studio. FYI: No meu caso, descobri que o problema tinha a ver com a ordem de construção. Esqueci de definir as dependências de compilação na versão, configuração da solução para que os projetos fossem compilados no servidor em uma ordem diferente, de forma que o arquivo de entrada ainda não estivesse disponível quando a cópia foi executada. Certificar-se de que o .dll foi produzido antes que o outro projeto que precisava dele fosse corrigido para mim. Esse foi um problema muito sutil com a configuração da solução que o causou.
— shawn1874

Não era óbvio a princípio que a ordem de construção era para cada configuração. Eu pensei que era mais uma configuração de solução, mas evidentemente você tem que atualizar a ordem de construção em TODAS as configurações.
— shawn1874

3

Consegui corrigir meu Código 1 executando o Visual Studio como Admin. Aparentemente, ele não tinha acesso para executar os comandos do shell sem Admin.



2

Para mim, eu tinha que ter certeza de que o programa para o qual eu copiava o arquivo não estava funcionando no momento. Não houve erros na sintaxe. Espero que isso ajude alguém.


2

Acabei de receber o mesmo erro. Eu tinha um% no caminho de destino que precisava ser escapado

c:\projects\%NotAnEnvironmentVariable%

precisava ser

c:\projects\%%NotAnEnvironmentVariable%%

2

Ok, esse é um problema com muitas soluções, então eu só posto o meu para dar mais dicas às pessoas. Minha situação é verificar as pastas em seu caminho e certificar-se de que todas elas existem em sua máquina. Por exemplo: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb", mas "Bin" não está na pasta partBin.


1
BTW, \ after $(SolutionDir)é redundante.
— Diablo

2

Para aqueles que usam o comando 'copiar' em Eventos de construção (linha de comando de evento de pré-construção ou / e linha de comando de evento de pós-construção) em Projeto -> Propriedades: a pasta de destino deve existir


0

Tantas soluções ...

No meu caso, tive que salvar o arquivo bat com codificação não Unicode (Western, Windows). Por padrão, quando adicionei o arquivo ao Visual Studio (e provavelmente deveria ter feito fora do VS), ele adicionou a codificação UTF-8.


0

Eu tive o mesmo problema e descobri que era porque eu havia renomeado o projeto. Entrei nas propriedades do projeto e alterei o nome do assembly e o namespace raiz para o nome do projeto e funcionou muito bem depois disso!


0

Ainda outra resposta ...

No meu caso, eu tinha um projeto do Visual Studio 2017 voltado para .Net Standard 1.3 e .Net Framework 2.0. Isso foi especificado no arquivo .csproj assim:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

Eu também tinha uma linha de comando de evento pós-compilação como esta:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

Em outras palavras, eu estava tentando copiar o .Net Framework .dll produzido pelo build para um local alternativo.

Isso estava falhando com este erro quando fiz uma reconstrução:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

Depois de muita frustração, finalmente concluí que o que estava acontecendo era que o Rebuild excluía todos os arquivos de saída, depois fazia a compilação para .Net Standard 1.3 e, em seguida, tentei executar a linha de comando do evento pós-compilação, que falhou porque o arquivo a ser copiado ainda não foi construído.

Portanto, a solução foi alterar a ordem de construção, ou seja, construir primeiro para .Net Framework 2.0 e depois para .Net Standard 1.3.

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

Isso agora funciona, com a pequena falha de que a linha de comando do evento pós-compilação está sendo executada duas vezes, portanto, o arquivo é copiado duas vezes.


0

No meu caso, eu tive que cd(mudar de diretório) antes de chamar o arquivo bat, porque dentro do arquivo bat havia uma operação de cópia que especificava caminhos relativos.

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.