Encontré la respuesta aquí:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010 tiene excelentes características de publicación de proyectos de aplicación web que le permiten publicar fácilmente su proyecto de aplicación web con solo hacer clic en un botón. Detrás de escena, la transformación de Web.config y la construcción del paquete se realiza mediante un script MSBuild masivo que se importa a su archivo de proyecto (que se encuentra en: C: \ Archivos de programa (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Publicación.web.targets). Desafortunadamente, el script es enormemente complicado, desordenado e indocumentado (aparte de algunos comentarios a menudo mal escritos y en su mayoría inútiles en el archivo). Un gran diagrama de flujo de ese archivo y algo de documentación sobre cómo conectarlo sería bueno, pero lamentablemente parece faltar (o al menos no puedo encontrarlo).
Desafortunadamente, esto significa que realizar la publicación a través de la línea de comandos es mucho más opaco de lo que debería ser. Me sorprendió la falta de documentación en esta área, porque en estos días muchas tiendas usan un servidor de integración continua y algunas incluso hacen implementación automatizada (con lo que las funciones de publicación de VS2010 podrían ayudar mucho), así que habría pensado que habilitar esto ( ¡fácilmente!) habría sido un requisito bastante importante para la función.
De todos modos, después de buscar en el archivo Microsoft.Web.Publishing.targets durante horas y golpearme la cabeza contra la pared de prueba y error, me las arreglé para descubrir cómo Visual Studio parece realizar su magia con un clic en "Publicar en el sistema de archivos". y funciones de "Build Deployment Package". Me adentraré un poco en las secuencias de comandos de MSBuild, por lo que si no está familiarizado con MSBuild, le sugiero que consulte esta página de MSDN del curso intensivo.
Publicar en el sistema de archivos
El cuadro de diálogo Publicar en el sistema de archivos de VS2010 Me tomó un tiempo perder el tiempo porque esperaba que ocurriera un uso sensato de MSBuild. En cambio, VS2010 hace algo bastante extraño: pide a MSBuild que realice una especie de implementación parcial que prepara los archivos de la aplicación web en la carpeta obj de su proyecto, luego parece hacer una copia manual de esos archivos (es decir, fuera de MSBuild) en su carpeta de publicación de destino. Este es realmente un comportamiento de golpe porque MSBuild está diseñado para copiar archivos (y otras cosas relacionadas con la compilación), por lo que tendría sentido si todo el proceso fuera solo un objetivo de MSBuild al que llamó VS2010, no un objetivo y luego una copia manual.
Esto significa que hacer esto a través de MSBuild en la línea de comandos no es tan simple como invocar su archivo de proyecto con un objetivo en particular y establecer algunas propiedades. Deberá hacer lo que debería haber hecho VS2010: cree un objetivo usted mismo que realice la mitad de la implementación y luego copie los resultados en la carpeta de destino. Para editar el archivo de su proyecto, haga clic derecho en el proyecto en VS2010 y haga clic en Descargar proyecto, luego haga clic derecho nuevamente y haga clic en Editar. Desplácese hacia abajo hasta encontrar el elemento Importar que importa los destinos de la aplicación web (Microsoft.WebApplication.targets; este archivo importa el archivo Microsoft.Web.Publishing.targets mencionado anteriormente). Debajo de esta línea agregaremos nuestro nuevo objetivo, llamado 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>
Este destino depende del destino PipelinePreDeployCopyAllFilesToOneFolder, que es lo que VS2010 llama antes de realizar su copia manual. Un poco de investigación en Microsoft.Web.Publishing.targets muestra que llamar a este objetivo hace que los archivos del proyecto se coloquen en el directorio especificado por la propiedad _PackageTempDir.
La primera tarea que llamamos a nuestro objetivo es la tarea Error, sobre la cual hemos colocado una condición que asegura que la tarea solo ocurra si la propiedad PublishDestination no se ha establecido. Esto lo detectará y generará un error en la compilación en caso de que haya olvidado especificar la propiedad PublishDestination. Luego llamamos a la tarea MakeDir para crear ese directorio PublishDestination si aún no existe.
Luego definimos un elemento llamado PublishFiles que representa todos los archivos que se encuentran en la carpeta _PackageTempDir. Luego se llama a la tarea Copiar, que copia todos esos archivos en la carpeta Destino de publicación. El atributo DestinationFiles en el elemento Copy es un poco complejo; realiza una transformación de los elementos y convierte sus rutas en nuevas rutas arraigadas en la carpeta PublishDestination (consulte Metadatos de elementos conocidos para ver qué significan esos% () s).
Para llamar a este objetivo desde la línea de comandos, ahora podemos simplemente ejecutar este comando (obviamente cambiando el nombre del archivo del proyecto y las propiedades para que se adapte a usted):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
existe para compatibilidad con versiones anteriores. VS2010 requiere que exista esta importación, incluso si se omite debido a la condición falsa. Si vuelve a mirar, verá que csproj contiene otra importación para la$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
que se resuelve en el archivo de destinos para la versión actual de Visual Studio.