NAnt ou MSBuild, qual escolher e quando?

160

Estou ciente de que existem outras perguntas relacionadas ao NAnt e MSBuild no Stack Overflow, mas não consegui encontrar uma comparação direta entre os dois, e aqui está a questão.

Quando alguém deve escolher o NAnt em vez do MSBuild? Qual é o melhor para quê? O NAnt é mais adequado para projetos domésticos / de código aberto e o MSBuild para projetos de trabalho? Qual é a experiência com qualquer um dos dois?

Yordan Pavlov
fonte

Respostas:

97

Eu fiz uma investigação semelhante esta semana. Aqui está o que eu consegui determinar:

NAnt:

  • Plataforma cruzada (suporta Linux / Mono). Pode ser útil para instalar um site em vários destinos (ou seja, Linux Apache e Windows IIS), por exemplo.
  • 95% de sintaxe semelhante ao Ant (fácil para os usuários atuais do Ant ou construtores de Java buscarem)
  • Integração com o NUnit para executar testes de unidade como parte da compilação e com o NDoc para produzir documentação.

MSBuild:

  • Incorporado ao .NET.
  • Integrado ao Visual Studio
  • Fácil de começar com o MSBuild no Visual Studio - tudo nos bastidores. Se você quiser se aprofundar, pode editar manualmente os arquivos.

Diferenças subjetivas: (YMMV)

  • A documentação do NAnt é um pouco mais direta. Por exemplo, a Referência de Tarefas do MSBuild lista "Tarefa Csc - Descreve a tarefa Csc e seus parâmetros." (Obrigado pela "ajuda"?), Em comparação com a Referência da tarefa NAnt "programas csc - Compila C #". ATUALIZAÇÃO: Notei que a documentação do MSBuild foi aprimorada e está muito melhor agora (provavelmente a par do NAnt).
  • Não é fácil descobrir como editar a fonte do script de compilação (arquivo de projeção *. *) Diretamente do Visual Studio. Com o NAnt, apenas o Visual Studio trata o script .build como um arquivo XML.
  • Aparentemente, no Visual Studio, os projetos de aplicativos da Web não recebem um arquivo *. * Proj por padrão, por isso tive muita dificuldade em descobrir como fazer o MSBuild rodar no meu para criar um script de implantação.
  • O NAnt não é interno ao Visual Studio e precisa ser adicionado, com um suplemento ou como uma "ferramenta externa". É um pouco difícil de configurar.
  • (Editar :) Um dos meus colegas de trabalho trouxe isso à tona - se você deseja configurar uma máquina de compilação usando o CruiseControl para integração contínua, o CruiseControl integra-se perfeitamente ao NAnt. ATUALIZAÇÃO: CruiseControl também tem uma tarefa MSBuild .
  • Por favor, veja os comentários abaixo para uma discussão completa e atualizada das diferenças subjetivas.
Salmo Ogro33
fonte
você pode editar um arquivo proj mas depois de descarregar o projeto (deve haver uma opção "Descarregar" no menu de contexto para o projeto)
Yordan Pavlov
18
@Yordan: ou simplesmente coloque suas personalizações em um arquivo .build separado (ou o que seja) e importe + execute-o no seu arquivo .csproj. Depois, você só precisa editar o arquivo .csproj uma vez e pode adicionar o arquivo .build à sua solução. Clique duas vezes e você está editando como qualquer outro arquivo. Pode mapear arquivos .build para o editor XML em suas opções.
21710 Kent Kentogaoga
9
Existe uma tarefa MSBuild CCNet - Os detalhes podem ser encontrados em: confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Gavin Miller
2
Vale ressaltar que você não precisa modificar os arquivos .csproj. Você pode usar um arquivo MyProject.csproj.user para fazer essas modificações, deixando o arquivo .csproj limpo e intocado. O MSBuild sabe procurar esses arquivos .user e os importará para o processo de compilação automaticamente. Veja: ahmed0192.blogspot.com/2006/11/…
CleverPatrick
3
@CleverHuman, esse arquivo .user normalmente não contém mods específicos do usuário para o projeto que você normalmente não faria o check-in junto com o restante do projeto? Eu uso a sugestão de Kent há anos e funciona muito bem. Você modifica o arquivo PROJ uma vez para incluir um segundo arquivo PROJ e adiciona o segundo arquivo PROJ ao seu projeto. A partir de então, você pode personalizar facilmente o segundo arquivo PROJ sem ter que passar pelo processo de Descarregar / recarregar. Costumo me inclinar para o MSBuild exatamente por esse motivo.
precisa saber é o seguinte
77

Um dos principais atrativos do MSBuild para mim (nas plataformas Windows) é que ele faz parte do próprio .NET. Isso significa que qualquer máquina Windows que esteja atualizada com o Windows Update terá o MSBuild disponível. Adicione a isso o fato de o compilador C # também fazer parte do próprio .NET e você ter uma plataforma que pode criar projetos em máquinas limpas. Não é necessário instalar o gigante do Visual Studio. O NAnt, por outro lado, precisa ser explicitamente instalado antes que uma compilação possa ser acionada.

Apenas para constar, usei NMake, Make, Ant, Rake, NAnt e MSBuild em construções não triviais do passado (nessa ordem). Meu favorito é o MSBuild, sem dúvida (e eu não sou a favor porque "é isso que o Visual Studio usa"). IMHO, é uma ferramenta de construção muito subestimada.

Eu compararia NAnt x MSBuild à diferença entre programação procedural e funcional. NAnt é bastante direto e você consegue o que vê. O MSBuild, por outro lado, requer um pouco mais de reflexão. A curva de aprendizado é mais acentuada. Mas uma vez que você "entende", pode fazer coisas incríveis com ele.

Portanto, eu recomendaria olhar para o MSBuild se você também se interessar por programação de estilo funcional ou lógico - se estiver disposto a investir um pouco de tempo e esforço antes de ver resultados tangíveis (é claro, eu também acredito fortemente que o investimento eventualmente compensa e você pode fazer coisas mais poderosas com mais eficiência).

Milan Gardian
fonte
11
Uau! Não sabia que o MSBuild foi enviado com o tempo de execução. Isso é muito legal e eu definitivamente posso ver benefícios por lá. No entanto, não entendo a comparação entre funcional / processual. Seria interessante ouvir o que torna o MSBuild muito mais poderoso quando se "entende".
Scott Saad
2
Na verdade, o Msbuild possui várias dependências em arquivos de vários sdks que só se tornam aparentes durante a chamada de determinados destinos. Portanto, embora o msbuild esteja disponível imediatamente, ele pode não ser executado.
Sam Shiles 11/11/11
6
uma coisa que deve ser adicionada: não só é possível chamar os assemblies .NET de dentro do msbuild, o que dá acesso a várias funções muito úteis (por exemplo, tudo no Systme.IO.Path pode ser útil nos scripts de construção) , também é possível escrever código C # simples em arquivos msbuild e executá-lo. O que é simplesmente impressionante. msdn.microsoft.com/en-us/library/dd722601.aspx E se as coisas ficarem muito complicadas, escrever tarefas personalizadas também é fácil.
stijn
1
Da Wikipedia: "O MSBuild foi anteriormente empacotado com o .NET Framework; a partir do Visual Studio 2013, no entanto, é empacotado com o Visual Studio."
precisa saber é o seguinte
O MSBuild (Microsoft Build Tools 2013) também pode ser baixado independentemente do Visual Studio 2013 aqui .
precisa saber é o seguinte
45

Pessoalmente, eu uso os dois - para o mesmo projeto.

O MSBuild é ótimo na criação de soluções e projetos do Visual Studio - é para isso que ele foi feito.

NAnt é mais facilmente editável à mão, na minha opinião - principalmente se você já conhece o Ant. O NAnt pode chamar o MSBuild com muita facilidade com o NAntContrib. Então, eu crio manualmente um script NAnt para fazer coisas como copiar arquivos construídos, limpar etc - e chamo o MSBuild para fazer a parte real "transformar meu código-fonte C # em assemblies".

Se você quiser um exemplo disso, veja meu arquivo de construção de Buffers de Protocolo . (Eu não diria que é um fabuloso script NAnt, mas funciona.)

Jon Skeet
fonte
1
E suporta Mono. O suporte ao MSBuild da Mono é ruim.
Mehrdad Afshari
@Mehrdad: Sim, em algum momento eu realmente preciso tentar fazer com que os Buffers de Protocolo compilem no Mono ... atualmente, há um bug do gmcs que o impede de funcionar :( A idéia sempre foi que eventualmente funcionaria no Mono.
Jon Skeet
1
Pessoal, mono usa o XBuild e é fácil portar o MSBuild para o XBuild. Verifique isto: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
Fyasar
20

O NAnt possui mais recursos prontos , mas o MSBuild possui uma estrutura fundamental muito melhor (rochas de metadados do item), o que facilita a criação de scripts reutilizáveis ​​do MSBuild.

O MSBuild leva um tempo para entender, mas uma vez feito, é muito bom.

Materiais de aprendizagem:

Konstantin Tarkus
fonte
38
Hey, eu ouvi daqueles livros :)
Sayed Ibrahim Hashimi
19

KISS = Use MSBuild.

Por que adicionar outra coisa à mistura quando você tem algo que fará um trabalho razoável fora da caixa? Quando o MSBuild chegou, NAnt morreu. E o Mono terá uma implementação do MSBuild ( xbuild ).

DRY = Use MSBuild.

Pergunte a si mesmo o que você quer de um sistema de compilação? Eu quero um sistema de compilação que também seja usado pelo meu IDE, em vez de manter duas configurações diferentes.

Pessoalmente, eu adoraria ouvir alguns argumentos reais para o NAnt, porque simplesmente não consigo pensar em nenhum que realmente retenha água.

esquilo
fonte
2
"Quando o msbuild surgiu, nant morreu" - acho que esse é o argumento decisivo, mesmo sem o VS (que não uso).
harpo 8/03/10
Concordo. O DotNet 1.1 não possui o msbuild.exe. Então estávamos ferrados naquela época. Desde a versão 2.0, o msbuild.exe e as bibliotecas extras fazem muito. E escrever uma MsBuild-Task personalizada tem uma curva de aprendizado, mas escrevi cerca de 10 delas ao longo dos anos.
granadaCoder
1
Eu tenho que concordar, você deve usar a mesma ferramenta para compilar como desenvolvedor que o servidor de compilação usará, permitindo que você falhe mais rapidamente.
Krystan honra
14

Uma coisa que notei que vários pôsteres mencionaram foi a necessidade de editar manualmente os arquivos .csproj (ou .vbproj, etc.).

O MSBuild permite a personalização desses arquivos. * Proj através do uso de arquivos .user. Se eu tiver um projeto chamado MyCreativelyNamedProject.csproj e quiser personalizar as tarefas do MSBuild, posso criar um arquivo chamado MyCreativelyNamedProject.csproj.user e usar o CustomBeforeMicrosoftCommonTargets e CustomAfterMicrosoftCommonTargets para personalizar esses arquivos.

Além disso, o NAnt e o MSBuild podem ser personalizados para o conteúdo do coração por meio de tarefas personalizadas do MSBuild e por extensões do NantContrib.

Portanto, o uso do NAnt ou MSBuild realmente se resume à familiaridade:

  • Se você já conhece o Ant, use o NAnt. A curva de aprendizado será muito fácil.
  • Se você não estiver familiarizado com nenhuma das ferramentas, o MSBuild já estará integrado ao Visual Studio e não precisará de ferramentas adicionais.

Também vale a pena acrescentar que é garantido que o MSBuild funcione com todas as novas versões do .NET e Visual Studio assim que forem lançadas, enquanto o NAnt pode ter algum atraso.

CleverPatrick
fonte
1
+1 para apontar o atraso entre os lançamentos .net e os nant. Lembro-me de quando o .net 3.5 foi lançado e o uso de um nant.exe.config hackeado nas redes para fazer as coisas funcionarem. Não tem graça.
Mmacaulay
9
De acordo com várias postagens por aqui, esses arquivos .USER contêm + informações específicas do usuário + que não devem ser registradas, portanto esse seria o último lugar em que eu gostaria de colocar personalizações de compilação ... Quaisquer personalizações de compilação, por definição, não deveriam 't ser específico de usuário, e assim não deve ir nesses arquivos .user ...
DarinH
1
Concordo com a drventure; Os arquivos .user são como o nome sugere e não devem ser verificados no repositório de controle de origem. Este NÃO é o lugar para automatizar a compilação.
Kjetil Klaussen
10

Eu uso os dois porque meus scripts NAnt chamam MSBuild. Meu principal motivo para ficar com NAnt é o isolamento . Deixe-me explicar por que sinto que isso é importante:

  1. Adicionando dependências ao seu projeto. O arquivo de construção NAnt é estranho ao Visual Studio (no meu caso, considero isso um profissional), portanto, o Visual Studio não tenta fazer nada com ele. As tarefas do MSBuild são incorporadas para fazer parte da solução e podem se referir a outras tarefas do MSBuild. Recebi o código fonte de outra pessoa apenas para descobrir que não consegui construir, porque as tarefas da comunidade MSBuild não foram instaladas. O que acho particularmente frustrante é que o Visual Studio simplesmente não criou e gerou muitos erros que me fizeram perder tempo na depuração. Isso, apesar do fato de que a compilação solicitada poderia ter avançado (como uma compilação de depuração, por exemplo) sem alguns dos extras da tarefa MSBuild. Resumindo: não gosto de adicionar dependências ao meu projeto se puder evitá-lo .

  2. Não confio no Visual Studio na medida em que pude lançar sua equipe de desenvolvimento. Isso remonta aos primeiros dias do Visual Studio, quando massacrava meu HTML. Ainda não uso o designer, por exemplo (em uma conferência recentemente, descobri que colegas fizeram o mesmo). Eu descobri que o Visual Studio pode estragar dependências e números de versão no arquivo DLL (não consigo replicar isso, mas aconteceu em um projeto de forma consistente e causou muita dor e perda de tempo). Eu recorri a um procedimento de compilação que usa o Visual Studio para compilar apenas no modo de depuração. Para produção, eu uso o NAnt para controlar tudo externamente . O Visual Studio não pode mais interferir se eu criar usando o NAnt.

PS: Sou desenvolvedor web e não desenvolvo o Windows Forms.

Peter Mortensen
fonte
6

Embora eu não esteja muito familiarizado com o MsBuild, tenho a impressão de que algumas das principais diferenças de ambos os lados podem ser complementadas por adições:

Recentemente, tive que construir um projeto do Silverlight em Nant. Eu descobri que a vida seria mais fácil se eu fizesse isso com o MsBuild - acabei chamando uma tarefa MsBuild de dentro de um script Nant, então suponho que não seja muito fora do comum misturar e combinar os dois.

Além disso, suponho que seja uma questão de preferência pessoal - obviamente, você pode gerenciar algumas / a maioria das funcionalidades do MsBuild no Visual Studio, se é isso que você gosta. Nant parece mais flexível e mais adequado se você preferir escrever scripts manualmente e, se você vem do mundo Java, provavelmente estará em casa com ele.

mmacaulay
fonte
Bom ponto. Ambas as soluções podem ser facilmente estendidas e personalizadas da maneira que desejar.
CleverPatrick
2

Acabei usando os dois. Ao redesenhar nosso sistema de construção, eu estava enfrentando um problema complicado. Ou seja, eu não conseguia me livrar do .vcproj (e da família) porque todo mundo estava usando o VS para atualizar os arquivos, as configurações e os projetos do projeto. Portanto, sem um processo enorme de duplicação e propenso a erros, não poderíamos basear nosso sistema de criação em um novo conjunto de arquivos.

Por esse motivo, decidi manter os arquivos 'proj' do VS e usar o MSBuild (eles são arquivos do MSBuild, pelo menos o VS2005 e o VS2008 usam arquivos de projeto do MSBuild). Para todo o resto (configuração personalizada, teste de unidade, embalagem, preparação de documentação ...) usei o NAnt.

Para integração contínua, usei o CruiseControl. Por isso, tínhamos scripts CC que acionavam os trabalhos do NAnt, que para a construção do MSBuild usado.

Uma observação final: o MSBuild NÃO suporta projetos de instalação! Então, você está preso ao ligar para o DevEnv.com ou ao usar o Visual Studio diretamente. Foi o que acabei fazendo, mas desativei o projeto de instalação por padrão de todas as configurações da solução, já que os desenvolvedores normalmente não precisariam compilá-los e, se o fizerem, eles podem selecionar manualmente.

Cinza
fonte
1

A documentação e os tutoriais disponíveis para o NAnt facilitam o aprendizado de scripts de construção com o NAnt. Depois de pegar o jeito do NAnt e criar scripts de construção, comecei a traduzir esse conhecimento para o MSBuild (fiz o X no NAnt, como faço o X no MSBuild?). A documentação da Microsoft geralmente assume um nível bastante alto de conhecimento antes de ser útil.

O motivo da mudança do NAnt para o MSBuild é porque o MSBuild é mais atual. Infelizmente, a última versão do NAnt foi em 8 de dezembro de 2007, enquanto o MSBuild 4.0 (.NET 4.0) não está muito longe. Parece que o projeto NAnt morreu.

Se você encontrar uma boa documentação para alguém que está começando a aprender a criar scripts de compilação usando o MSBuild, pule o NAnt e vá direto para o MSBuild. Se o NAnt lançar um novo lançamento, eu consideraria ficar com o NAnt, mas eles estão atrasados ​​agora.

Mcdon
fonte
1
Em junho de 2012, a versão 0.92 do NAnt estava disponível no site: nant.sourceforge.net E suporta o .NET 4.0.
Brett Rigby
0

Nós usamos os dois. O NAnt é responsável por todo o material de "script", como copiar, implantar no IIS , criar pacotes e o MSBuild é responsável pela criação da solução. Em seguida, podemos evitar problemas com o .NET 4.0 não suportado por uma nova versão do NAnt.

NAnt também é mais escalável. Se queremos migrar os scripts de implantação para os servidores de produção, copiamos apenas o arquivo de compilação e instalamos uma versão adequada do .NET - sem problemas do Visual Studio com arquivos csproj :)

Leszek Wachowicz
fonte
0

O YDeliver by Manoj é um framework de construção construído sobre o PSake. Ele possui um rico conjunto de funções de biblioteca, capacidade de definir fluxos de trabalho e nós o usamos para entregar mais de seis projetos empresariais à produção.

Use-o em conjunto com o TeamCity , CruiseControl ou qualquer coisa que possa executar o PowerShell .

Zasz
fonte
0

Nós usamos o FlubuCore. É uma biblioteca C # de código aberto para criar projetos e executar scripts de implantação usando o código C #.

Exemplo simples de como o flubu é usado:

protected override void ConfigureTargets(ITaskContext session)
{           

    var compile = session.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddTask(x => x.CompileSolutionTask())
        .DependsOn("generate.commonassinfo");
}

Você pode encontrar mais informações sobre o flubu e como começar aqui: escolha-para-construir-ferramenta-msbuild-nant-ou-outra-coisa

Stan88
fonte