ti-enxame.com

Como forçar o VS 2010 a ignorar "compilações" de projetos que não foram alterados?

A solução do nosso produto possui mais de 100 projetos (500 + ksloc de código de produção). A maioria deles são projetos C #, mas também temos poucos usando C++/CLI para conectar a comunicação com código nativo.

A reconstrução de toda a solução leva vários minutos. Isso é bom. Se eu quiser reconstruir a solução, espero que isso realmente leve algum tempo. O que não está bom é o tempo necessário para criar a solução após a reconstrução completa. Imagine que eu usei a reconstrução completa e, agora, sem fazer alterações na solução, pressiono Build (F6 ou Ctrl + Shift + B). Por que leva 35s se não houve mudança? Na saída, vejo que ele começou a "construir" cada projeto - ele não realiza uma compilação real, mas faz algo que consome uma quantidade significativa de tempo.

Esse atraso de 35s é um pé no saco. Sim, posso melhorar o tempo não usando a solução de compilação, mas apenas o projeto de compilação (Shift + F6). Se eu executar o projeto de construção em um projeto de teste específico, atualmente estou trabalhando nele, levará "apenas" 8 + s. Ele exige que eu execute a compilação do projeto no projeto correto (o projeto de teste para garantir que o código testado dependente também seja compilado). Pelo menos, o executor de teste do ReSharper reconhece corretamente que apenas esse único projeto deve ser compilado e o teste de nova execução geralmente contém apenas 8 + s de compilação. Meu Kata de codificação atual é: não toque em Ctrl + Shift + B.

A construção do projeto de teste levará 8s, mesmo que eu não faça nenhuma alteração. A razão pela qual leva 8s é porque também "constrói" dependências = no meu caso, "constrói" mais de 20 projetos, mas fiz alterações apenas no teste de unidade ou na dependência única! Não quero que ele toque outros projetos.

Existe uma maneira de simplesmente dizer ao VS para criar apenas projetos onde algumas alterações foram feitas e projetos que dependem de outros alterados (de preferência esta parte como outra opção de construção)? Eu me preocupo que você me diga que é exatamente o que o VS está fazendo, mas no modo MS ...

Quero melhorar minha experiência com TDD e reduzir o tempo de compilação (no TDD, a compilação pode acontecer duas vezes por minuto).

Para tornar isso ainda mais frustrado, estou trabalhando em uma equipe na qual a maioria dos desenvolvedores trabalhava em projetos Java antes de ingressar neste). Assim, você pode imaginar como eles ficam chateados quando precisam use o VS em contraste com a compilação incremental completa em Java. Não preciso de compilação incremental de classes . Espero trabalhar com a compilação incremental de soluções. Especialmente em produtos como o VS 2010 Ultimate, que custa vários milhares de dólares.

Eu realmente não quero obter respostas como:

  • Faça uma solução separada
  • Descarregar projetos que você não precisa
  • etc.

Eu posso ler essas respostas aqui . Essas não são soluções aceitáveis. Não estamos pagando para o VS fazer esses compromissos.

45
Ladislav Mrnka

Por padrão, o Visual Studio sempre executa a compilação de cada projeto em sua solução quando você executa um único projeto. Mesmo que esse projeto não dependa de todos os outros projetos da sua solução.

Vá para Ferramentas | Opções | Projetos e Soluções | Compilar e executar e marque a caixa " Crie apenas projetos e dependências de inicialização na execução ". Desde agora, quando você executa o seu projeto (tecla F5), o Visual Studio cria apenas o seu projeto de inicialização e os projetos da solução em que ele depende.

13
Dmitriy Konovalov

Existe uma maneira de simplesmente dizer ao VS para criar apenas projetos onde algumas alterações foram feitas e projetos que dependem de outros alterados (de preferência esta parte como outra opção de construção)? Eu me preocupo que você me diga que é exatamente o que o VS está fazendo, mas no modo MS ...

Na verdade não (você já entende).

Você está falando de um "sistema de compilação". MSVS não é isso. É um IDE, que permite que você organize seus ativos em projetos e soluções e, sim, "construa". Mas, não é um sistema de compilação. Nunca será um sistema de compilação (longa história, mas é necessária uma tecnologia muito diferente).

Por outro lado, o MSVS é um IDE para o desenvolvimento iterativo acelerado, incluindo o ciclo de "depuração" (por exemplo, "entrada e saída" no depurador durante a execução do sistema). É aí que o MSVS "brilha".

Ele não brilha e nunca brilha como um sistema de construção. Não foi para isso que foi criado. E isso provavelmente nunca mudará (uma história longa, até a Microsoft provavelmente concordará).

Não estou tentando ser fofo, e peço desculpas sinceramente por fornecer esta notícia. Essa resposta também me machuca.

Espero trabalhar compilação incremental de soluções. Especialmente em produtos como o VS 2010 Ultimate, que custa vários milhares de dólares.

O MSVS é um IDE para depuração/desenvolvimento interativo, e não um sistema de compilação (veja acima). Portanto, você está medindo-o em um cenário de produto para o qual não foi projetado e no qual provavelmente nunca funcionará como desejar.

Eu realmente não quero obter respostas como:

  • Faça uma solução separada
  • Descarregar projetos que você não precisa
  • etc.

Eu posso ler essas respostas. Essas não são soluções aceitáveis. Não estamos pagando para o VS fazer esses compromissos.

Suas expectativas são razoáveis. Eu também os quero. No entanto, o MSVS não é um produto que nunca será entregue.

Mais uma vez, não estou tentando ser "fofo". Se você estiver disposto a investir em um "sistema de compilação", poderá encontrar valor ao usar algo como CMake para gerenciar suas configurações e exportar Makefiles (ou algo) para executar seu "real "cria, mas também" exporta "arquivos *.vcproj e *.sln para quando você deseja trabalhar de forma interativa e interativa no IDE do MSVS.

EDIT: Em vez disso, o que você deseja é um SSD (disco de estado sólido) para o seu espaço de trabalho de construção para obter uma melhoria de velocidade em 10x, ou um disco RAM para uma melhoria de velocidade de 100x para compilações (sem brincadeira, 64MB RAM em um soquete LGA2011 fornece um disco RAM] de 32MB, que é o que usamos.)

8
charley

Uma coisa que você pode fazer é dividir seu aplicativo em pequenas soluções, cada uma sendo uma parte coesa. Crie cada solução separadamente. Peça a cada solução que use as saídas das soluções de que depende, em vez de usar o código-fonte.

Isso permitirá ciclos de feedback mais curtos para cada componente

EDIT: Solução Modificada

Além disso, você criará uma compilação integrativa que, em vez de obter todas as fontes, compilando e testando, obterá os produtos de compilação binária do componente CI cria. Essa compilação integrativa deve ser acionada para ser executada após cada compilação de componente bem-sucedida.

Essa compilação deve ser o equivalente binário de uma compilação completa (que você ainda deve compilar todas as noites), mas levará consideravelmente menos tempo para executar, porque aciona após um incremento de componente e não precisa compilar ou obter nenhuma fonte.

Além disso, se você usar um sistema de construção de nível corporativo que suporte o conceito de distribuição de suas construções entre vários agentes, poderá dimensionar seus esforços e reduzir seu ciclo completo de IC para a quantidade de tempo que leva para construir o componente mais longo e teste o conjunto integrativo (no máximo).

Espero que isto ajude.

4
Assaf Stone

Pesando um pouco tarde, mas você já pensou em ter diferentes configurações de compilação?

Você pode dizer ao visual studio para não criar determinados projetos, dependendo da configuração da compilação.

O desenvolvedor pode simplesmente selecionar a configuração relevante para o projeto em que está trabalhando.

2
Chris Haines

Thread bastante antigo, mas posso dizer que estava sofrendo de uma versão menor da mesma coisa e atualizei para o Visual Studio 2012 e os problemas parecem ter sido finalmente resolvidos. A solução RedGate .NET Demon mencionada acima também parece funcionar muito bem até agora.

1
Wade Hatler

Este é um problema antigo.

Use construção paralela e SSD. Veja aqui (eu acho - google rápido): http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx

0
Sentinel

Eu encontrei uma ferramenta que faz principalmente o que eu quero (e até mais): RedGate .NET Demon . Provavelmente ainda é a primeira versão porque encontrei alguns problemas em nossa grande solução (problemas com projetos C++, problemas com a alternância de alvos de construção e alguns outros), mas eu realmente gosto até agora. Eu gosto especialmente da maneira como ele tenta rastrear arquivos alterados no VS IDE e reconstrói apenas os projetos afetados.

Edit: O .NET Demon foi aposentado, pois não deveria ser necessário para o VS 2015. Ele ainda funciona com versões anteriores.

0
Ladislav Mrnka