Encontre a resposta aqui:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
O Visual Studio 2010 tem excelentes novos recursos de publicação de Projeto de Aplicativo da Web que permitem que você publique facilmente seu projeto de aplicativo da Web com o clique de um botão. Nos bastidores, a transformação Web.config e a construção do pacote são feitas por um script MSBuild massivo que é importado para o arquivo de projeto (encontrado em: C: \ Arquivos de programas (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets). Infelizmente, o script é extremamente complicado, confuso e não documentado (além de alguns comentários mal ortográficos e quase sempre inúteis no arquivo). Um grande fluxograma desse arquivo e alguma documentação sobre como conectá-lo seria bom, mas parece estar faltando (ou pelo menos não consigo encontrar).
Infelizmente, isso significa que a publicação por meio da linha de comando é muito mais opaca do que precisa ser. Fiquei surpreso com a falta de documentação nesta área, porque hoje em dia muitas lojas usam um servidor de integração contínua e algumas até fazem implantação automatizada (na qual os recursos de publicação do VS2010 poderiam ajudar muito), então pensei que habilitar isso ( facilmente!) seria um requisito bastante principal para o recurso.
De qualquer forma, depois de vasculhar o arquivo Microsoft.Web.Publishing.targets por horas e bater minha cabeça contra a parede de tentativa e erro, consegui descobrir como o Visual Studio parece realizar sua mágica com um clique “Publicar no sistema de arquivos” e recursos de “Build Deployment Package”. Entrarei em contato com o script do MSBuild, portanto, se você não estiver familiarizado com o MSBuild, sugiro que verifique esta página do MSDN do curso intensivo.
Publicar no sistema de arquivos
A caixa de diálogo Publicar no sistema de arquivos VS2010 Publicar no sistema de arquivos demorou um pouco para entender porque esperava que algum uso sensato do MSBuild estivesse ocorrendo. Em vez disso, o VS2010 faz algo bastante estranho: ele chama o MSBuild para realizar uma espécie de meia implantação que prepara os arquivos do aplicativo da web na pasta obj do seu projeto, então parece fazer uma cópia manual desses arquivos (ou seja, fora do MSBuild) em sua pasta de publicação de destino. Este é um comportamento realmente estranho porque o MSBuild foi projetado para copiar arquivos (e outras coisas relacionadas à compilação), então faria sentido se todo o processo fosse apenas um destino MSBuild que o VS2010 chamou, não um destino, mas uma cópia manual.
Isso significa que fazer isso por meio do MSBuild na linha de comando não é tão simples quanto invocar seu arquivo de projeto com um destino específico e definir algumas propriedades. Você precisará fazer o que o VS2010 deveria ter feito: crie você mesmo um destino que execute a implantação parcial e copie os resultados para a pasta de destino. Para editar seu arquivo de projeto, clique com o botão direito do mouse no projeto no VS2010 e clique em Unload Project, então clique com o botão direito novamente e clique em Edit. Role para baixo até encontrar o elemento Import que importa os destinos do aplicativo da web (Microsoft.WebApplication.targets; este arquivo importa o arquivo Microsoft.Web.Publishing.targets mencionado anteriormente). Abaixo dessa linha, adicionaremos nosso novo destino, chamado PublishToFileSystem:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
Esse destino depende do destino PipelinePreDeployCopyAllFilesToOneFolder, que é o que o VS2010 chama antes de fazer sua cópia manual. Algumas pesquisas em Microsoft.Web.Publishing.targets mostram que a chamada desse destino faz com que os arquivos do projeto sejam colocados no diretório especificado pela propriedade _PackageTempDir.
A primeira tarefa que chamamos em nosso destino é a tarefa Error, sobre a qual colocamos uma condição que garante que a tarefa só aconteça se a propriedade PublishDestination não tiver sido definida. Isso irá detectar você e errar na compilação caso tenha esquecido de especificar a propriedade PublishDestination. Em seguida, chamamos a tarefa MakeDir para criar esse diretório PublishDestination se ele ainda não existir.
Em seguida, definimos um item chamado PublishFiles que representa todos os arquivos encontrados na pasta _PackageTempDir. A tarefa Copiar é então chamada, copiando todos esses arquivos para a pasta Destino de Publicação. O atributo DestinationFiles no elemento Copy é um pouco complexo; ele realiza uma transformação dos itens e converte seus caminhos em novos caminhos enraizados na pasta PublishDestination (verifique os metadados de itens conhecidos para ver o que esses% () s significam).
Para chamar este destino a partir da linha de comando, podemos agora simplesmente executar este comando (obviamente alterando o nome do arquivo de projeto e as propriedades de acordo com você):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
existe para compatibilidade com versões anteriores. O VS2010 requer que esta importação exista, mesmo se for ignorada devido à condição falsa. Se você olhar novamente, verá que o csproj contém outra importação para a$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
qual resolve o arquivo de destino da versão atual do Visual Studio.