Diferença entre reconstruir e limpar + compilar no Visual Studio


Respostas:


308

Reconstruir = Limpar + Construir (normalmente)

Detalhes notáveis:

  1. Para uma solução para vários projetos, "reconstruir solução" faz uma "limpeza" seguida de uma "construção" para cada projeto (possivelmente em paralelo). Enquanto uma "solução limpa" seguida de uma "solução de construção" primeiro limpa todos os projetos (possivelmente em paralelo) e depois cria todos os projetos (possivelmente em paralelo). Essa diferença no seqüenciamento de eventos pode se tornar significativa quando as dependências entre projetos entram em jogo.

  2. Todas as três ações correspondem aos destinos do MSBuild. Portanto, um projeto pode substituir a ação Reconstruir para fazer algo completamente diferente.


2
Então você está dizendo que Reconstruir é exatamente o mesmo que um Limpar seguido por um Build ? Isso é o que eu pensava, mas não tinha certeza.
Jim McKeeth

43
Exceto Reconstruir limpa e reconstrói cada projeto, um por um. Clean + Build limpa todos eles e depois constrói todos eles. Faz diferença principalmente se você clicar nele por acidente :)
Eugene

25
Exceto pela falta de garantia de que são iguais. Veja a resposta de JaredPar abaixo, que combinada com a de Earl é a imagem completa. Como o Rebuild faz cada projeto por sua vez, você pode ter uma "caixa de canto" quando suas informações de dependência são desarrumadas e você obtém um projeto de construção de B fora de ordem usando o projeto antigo A, em seguida, reconstrua A, depois reconstrua C. etc. A solução completa A limpeza seguida de uma compilação de solução completa detectará essa situação enquanto a reconstrução não ocorrerá. Portanto, quanto mais paranóico e cansado você estiver, mais você deve favorecer o Clean e o Build.
Jason Harrison

14
Isso não é verdade. Eu tive um projeto em que o Clean + Build foi bem-sucedido e o Rebuild retornou erros de compilação (referências circulares ao arquivo). Portanto, eles não são 100% iguais.
Yaakov Ellis

2
Talvez desde que este post coisas mudaram, mas não há uma explicação por Reconstruir não é (não?) O mesmo que limpa + construção stackoverflow.com/questions/3095901/...
Dave

163

Earl está correto em 99% das vezes Rebuild = Clean + Build.

Mas eles não são garantidos para ser o mesmo. As três ações (reconstruir, criar, limpar) representam diferentes destinos do MSBuild. Cada um dos quais pode ser substituído por qualquer arquivo de projeto para executar ações personalizadas. Portanto, é perfeitamente possível que alguém substitua a reconstrução para executar várias ações antes de iniciar uma compilação limpa + (ou removê-las totalmente).

Muito um caso de canto, mas apontando devido a discussões de comentários.


Se você adicionar ações de compilação que movem os arquivos .dll para um novo local, poderá obter resultados de compilação "ruins" fazendo uma reconstrução. Se você misturar um projeto vb.net e c #, as coisas ficam ainda piores, criadores de formulários quebrados e sem trabalho.
CodingBarfield

+1 Observe também que o comportamento de reconstrução não parece ser consistente entre os idiomas em relação às dependências: stackoverflow.com/questions/12163080/…
lesscode

1
99% do tempo é superestimado.
Rhyous 23/03/19

58

Vamos definir a implementação padrão do Rebuild em termos das implementações padrão Clean e Build:

  1. Por projeto: Projeto de reconstrução = Projeto limpo + Projeto de construção.

  2. Por solução: Reconstrua sln = foreach project em sln (projeto Clean + Build project).

Observe que, devido às diferenças na ordem de execução, Reconstruir sln não é o mesmo que (Limpar sln + Construir sln) = (projeto foreach no sln Projeto limpo) + (projeto foreach no projeto sln Build). Além disso, esse "foreach" pode ser executado simultaneamente, portanto, tarefas diferentes podem ser executadas simultaneamente nos dois cenários.

Digamos que você tenha um sln que contenha proj1, proj2 e proj3.

  • Reconstruir sln = (Limpar proj1 + Construir proj1) & (Limpar proj2 + Construir proj2) & (Limpar proj3 + Construir proj3)

  • Limpar Sln + Construir Sln = (Limpar proj1 e Limpar proj2 e Limpar proj3) + (Construir proj1 e Construir proj2 e Construir proj3)

+ significa serial, & significa simultâneo.

Portanto, se as dependências do projeto não estiverem configuradas corretamente, há uma chance de que, ao executar o Rebuild sln, alguns de seus projetos sejam vinculados a uma biblioteca antiga. Isso ocorre porque não é garantido que todas as limpezas sejam concluídas antes do início da primeira compilação. Se você executar o Clean sln + Build sln, eles fornecerão um erro de link e o informarão imediatamente, em vez de fornecer um aplicativo com comportamento estranho.


7
Essa é a resposta mais exata, pois explica por que às vezes não consegui reconstruir, mas consegui limpar + build.
Toan Nguyen

11

Em http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm (apenas procurei no Google):

Compilar significa compilar e vincular apenas os arquivos de origem que foram alterados desde a última compilação, enquanto Reconstruir significa compilar e vincular todos os arquivos de origem, independentemente de terem sido alterados ou não. Construir é a coisa normal a fazer e é mais rápido. Às vezes, as versões dos componentes de destino do projeto podem ficar fora de sincronia e a reconstrução é necessária para tornar a compilação bem-sucedida. Na prática, você nunca precisa limpar.

Compilar ou recriar Solução cria ou reconstrói todos os projetos na sua solução, enquanto Compilar ou Reconstruir cria ou reconstrói o projeto StartUp, "olá" na captura de tela acima. Para definir o projeto StartUp, clique com o botão direito do mouse no nome do projeto desejado na guia Solution Explorer e selecione Set as StartUp project. O nome do projeto agora aparece em negrito. Como as soluções de tarefas domésticas normalmente têm apenas um projeto, a Solução Compilar ou Reconstruir é efetivamente a mesma que Compilar ou Reconstruir.

Compilar apenas compila o arquivo de origem atualmente sendo editado. Útil para verificar rapidamente erros quando o restante dos arquivos de origem estiver em um estado incompleto que impediria uma compilação bem-sucedida de todo o projeto. Ctrl-F7 é a tecla de atalho para Compilar.


Como Toan Nguyen, eu experimentei que às vezes Limpo + Criar solução sucesso onde um Rebuild Solution falhar (provavelmente devido a dependências entre projetos), pelo que esta resposta é enganosa, pelo menos em 2018.
Jon Coombs

4

A partir desta postagem no blog, o autor vinculou como comentário sobre esta pergunta :

Na verdade não!!! eles não são iguais.

A diferença está na seqüência de projetos serem limpos e construídos. Digamos que temos dois projetos em uma solução. Limpar e, em seguida, compilar executará a limpeza para ambos os projetos e, em seguida, a compilação ocorrerá individualmente enquanto na reconstrução o projeto A será limpo e depois compilado depois que o projeto B estiver limpo e depois compilado e assim por diante.

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.