especificar o arquivo de projeto de uma solução usando msbuild

116

Eu quero a linha de comando para construir um projeto específico de uma solução usando msbuild como fazemos com devenv.com.In devenv.com, podemos especificar um projeto de uma solução usando a seguinte linha de comando

devenv.com /Build Release|x86 test.sln /project "testproject"

Usando a linha de comando acima, posso construir o testproject no test.sln usando devenv.com.What é a linha de comando para msbuild para a mesma solução.

obrigado

tjdoubts
fonte
Alguma razão pela qual você não está apenas passando o próprio projeto de teste para o msbuild?
Mark Smith
2
Já que não posso mais editar meu comentário. O que quero dizer é fazer referência ao projeto diretamente em vez da solução. "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith
tempo diferente eu tenho que construir projetos diferentes. usando devenv.com é fácil especificando o projeto dessa solução
tjdoubts
Se esse é o único problema que você tem, você deve ser capaz de usar o msbuild para construir os projetos necessários nos momentos corretos. Você já tem comandos diferentes que executa em momentos diferentes na solução, então por que não apenas referenciar os projetos nos momentos apropriados com comandos msbuild diferentes? Se seus projetos estiverem configurados corretamente, eles devem descobrir todas as suas referências sem usar o arquivo sln.
Mark Smith

Respostas:

202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Observe que o que é atribuído /té o nome do projeto na solução, ele pode ser diferente do nome do arquivo do projeto.

Além disso, conforme declarado em Como: Criar destinos específicos em soluções usando MSBuild.exe :

Se o nome do projeto contém qualquer um dos personagens %, $, @, ;, ., (, ), ou ', substituí-los com um _em nome de destino especificado.

Você também pode construir vários projetos de uma vez:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Para reconstruir ou limpar, mude /t:projectpara /t:project:cleanou/t:project:rebuild

Easton L.
fonte
99
Uma observação importante: se o seu projeto tiver um '.' no nome, você precisará substituí-lo por '_' ao especificá-lo com / t
Watusimoto
4
@easton Para construir vários projetos, a sintaxe era para meu msbuild repetir o /tparâmetro para cada projeto a ser construído:msbuild test.sln /t:project /t:project2
Philippe
46
Além disso, se você estiver usando uma pasta de solução, deverá prefixar o nome do projeto com o nome da pasta e uma barra. Como @Watusimoto mencionado acima, se houver pontos (.) No nome, você deve substituí-los por sublinhados (_). Acabei com algo como isto: /t:SlnFolder\My_Project_name.
Travis Parks
28
@TravisParks: Também pode valer a pena mencionar que "pasta de solução" não se refere a uma pasta do sistema de arquivos, mas sim a uma pasta na visualização do Solution Explorer.
joshbodily
4
Também tive que substituir '(' e ')' por '_' no nome da pasta (projetos gerados por GYP). Acho que todos os caracteres especiais foram substituídos por sublinhado.
Maxime Viargues
15

O MSBuild realmente funciona por meio do uso de projetos, não da solução. A solução é usada apenas para analisá-lo em um arquivo de projeto temporário no MSBuild internamente. Você deve ser capaz de construir o projeto de interesse diretamente por meio do MSBuild executando o seguinte comando.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Há um grande problema que eu sei que você pode encontrar usando o projeto diretamente em vez da solução: se você usar a solução para expressar dependências entre os projetos, em vez de adicionar as referências ao projeto e deixar o sistema de compilação resolver as dependências automaticamente .

Se você está impondo uma ordem de construção usando o arquivo sln, recomendo trabalhar essas dependências diretamente nos arquivos proj e removê-los do sln. Isso permitirá que você invoque qualquer arquivo proj do MSBuild diretamente e os projetos serão todos construídos de forma independente, sem nenhum trabalho adicional. Você realmente deve tratar o arquivo sln como um grupo de projetos para facilitar o trabalho no Visual Studio e não como uma entrada de compilação.

Mark Smith
fonte
4
Indique como a ordem de construção pode ser aplicada a partir dos arquivos proj. Obrigado.
ProgramCpp de
4
Aqui está outro problema com o uso direto do nome do projeto. Por exemplo, você tem 5 projetos em sua solução. Alguns projetos têm configuração DebugPro e outros não. Se você construir um projeto com a configuração de que todos os projetos têm tudo em arquivo, mas apenas o arquivo de solução sabe qual configuração de projeto usar para cada projeto se você selecionou a configuração de solução DebugPro.
Alex
@ProgramCpp Quando você adiciona referências de um projeto a outro, ele automaticamente descobre que o projeto referenciado precisa ser construído primeiro.
jpaugh
Outra desvantagem dessa abordagem é que o caminho relativo no projeto é resolvido em relação ao arquivo de solução. Depois de construir o projeto, o caminho diretamente relativo mudará. A saída pode estar em outro lugar e os testes de unidade podem pesquisar diretórios errados.
Tomas Kubes
Também podem aparecer problemas se você usar variáveis ​​de solução na configuração do projeto, como $ (SolutionDir)
Alex Che
8

Postando como informação para futuros buscadores

Adicione o seguinte ao script de construção e execute-o uma vez. Isso irá gerar os alvos exatos e outras informações que o msbuild realmente usará.

Ex: Se você tiver .no nome do projeto ou nas pastas, o msbuild irá esperar _no lugar do ..

set MSBuildEmitSolution=1

Depois de obter as informações, atualize o script de construção com os detalhes necessários.

Freshprinze
fonte
6
`Se você tiver '.' no nome do projeto ou nas pastas, o msbuild esperará '_' no lugar de '.'. `
dhcgn
2

Para fazer isso, você precisa saber qual é o nome-alvo do projeto , não necessariamente o nome do projeto.

Uma maneira de descobrir isso é usar o MSBuild em seu SLN com os parâmetros pretendidos após definir uma variável de ambiente especial chamada MSBuildEmitSolutioncom o valor de 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Recentemente, tive que fazer isso devido a um nome muito específico para um destino em diretórios aninhados. Então, em meu arquivo gerado, my_stuff.sln.metaprojencontrei esta linha:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Isso significa que a linha de comando a ser usada acaba sendo,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64
kayleeFrye_onDeck
fonte
2
Era disso que eu precisava. Dica se você não quiser executar isso: seu destino é a estrutura de pastas do caminho atual para o arquivo do seu projeto, menos a extensão do arquivo do projeto ( .csprojno meu caso). I <3 ASSIM!
Sem Reembolsos Sem Devoluções
1

Apenas para adicionar informações adicionais, a execução de msbuild na pasta do projeto irá, por padrão, construir o arquivo do projeto, já que é o único lá.

>msbuild

Existem muitas variações de uso do msbuild dessa maneira. Você pode especificar o arquivo proj diretamente.

>msbuild helloworld.csproj -t:Build.

Revise a documentação do msbuild para uso, requisitos de arquivo proj, bem como os benefícios de construir o projeto em vez da solução.

Documentação MS MSBuild

Há benefícios em construir desta forma, conforme mencionado pelo ferreiro acima.

CJ
fonte