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.

Tim Scott
fonte
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.

Tim Scott
fonte
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ê. :-)

JanBorup
fonte
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.

Valamas
fonte
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!

Shalini
fonte
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

Wruckie
fonte
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).

Bohdan Kuts
fonte
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]>
TechSavvySam
fonte
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.

Jdurden
fonte
2

Como uma questão de boa prática, sugiro que você substitua o evento pós-compilação por uma tarefa de cópia de arquivo do MS Build .

Asher
fonte
3
quais são os benefícios de um sobre o outro?
GregC
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.

Richard S.
fonte
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%%
mosca de fogo
fonte
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.

David
fonte
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

sincronizado
fonte
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.

Tengiz
fonte
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!

golgothan 3
fonte
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.

RenniePet
fonte
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"
CrazyTim
fonte