J'ai trouvé la réponse ici:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010 propose de nouvelles fonctionnalités de publication de projet d'application Web qui vous permettent de publier facilement votre projet d'application Web en un clic. Dans les coulisses, la transformation Web.config et la construction du package sont effectuées par un script MSBuild massif qui est importé dans votre fichier de projet (trouvé à: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets). Malheureusement, le script est extrêmement compliqué, désordonné et non documenté (à part certains commentaires souvent mal orthographiés et pour la plupart inutiles dans le fichier). Un gros organigramme de ce fichier et de la documentation sur la façon de s'y connecter serait bien, mais il semble malheureusement manquer (ou du moins je ne le trouve pas).
Malheureusement, cela signifie que la publication via la ligne de commande est beaucoup plus opaque que nécessaire. J'ai été surpris par le manque de documentation dans ce domaine, car de nos jours, de nombreux magasins utilisent un serveur d'intégration continue et certains font même un déploiement automatisé (avec lequel les fonctionnalités de publication VS2010 pourraient beaucoup aider), alors j'aurais pensé que l'activation de cela ( facilement!) aurait été une exigence assez principale pour la fonctionnalité.
Quoi qu'il en soit, après avoir fouillé le fichier Microsoft.Web.Publishing.targets pendant des heures et m'être cogné la tête contre le mur d'essais et d'erreurs, j'ai réussi à comprendre comment Visual Studio semble exécuter sa magie en un clic "Publier dans le système de fichiers" et les fonctionnalités «Build Deployment Package». Je vais entrer dans un peu de script MSBuild, donc si vous n'êtes pas familier avec MSBuild, je vous suggère de consulter cette page MSDN du cours intensif.
Publier dans le système de fichiers
La boîte de dialogue Publier dans le système de fichiers de VS2010 La publication dans le système de fichiers m'a pris un certain temps, car je m'attendais à ce qu'une utilisation raisonnable de MSBuild se produise. Au lieu de cela, VS2010 fait quelque chose d'assez étrange: il appelle MSBuild pour effectuer une sorte de semi-déploiement qui prépare les fichiers de l'application Web dans le dossier obj de votre projet, puis il semble faire une copie manuelle de ces fichiers (c'est-à-dire en dehors de MSBuild) dans votre dossier de publication cible. C'est vraiment un comportement de folie car MSBuild est conçu pour copier des fichiers (et d'autres éléments liés à la construction), il serait donc logique que l'ensemble du processus ne soit qu'une seule cible MSBuild appelée par VS2010, pas une cible, puis une copie manuelle.
Cela signifie que faire cela via MSBuild sur la ligne de commande n'est pas aussi simple que d'appeler votre fichier de projet avec une cible particulière et de définir certaines propriétés. Vous devrez faire ce que VS2010 aurait dû faire: créez vous-même une cible qui effectue le demi-déploiement, puis copie les résultats dans le dossier cible. Pour modifier votre fichier de projet, faites un clic droit sur le projet dans VS2010 et cliquez sur Décharger le projet, puis cliquez à nouveau avec le bouton droit et cliquez sur Modifier. Faites défiler vers le bas jusqu'à ce que vous trouviez l'élément Import qui importe les cibles d'application Web (Microsoft.WebApplication.targets; ce fichier lui-même importe le fichier Microsoft.Web.Publishing.targets mentionné précédemment). Sous cette ligne, nous ajouterons notre nouvelle cible, appelée 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>
Cette cible dépend de la cible PipelinePreDeployCopyAllFilesToOneFolder, qui est ce que VS2010 appelle avant d'effectuer sa copie manuelle. Certains fouilles dans Microsoft.Web.Publishing.targets montrent que l'appel de cette cible entraîne le placement des fichiers de projet dans le répertoire spécifié par la propriété _PackageTempDir.
La première tâche que nous appelons dans notre cible est la tâche Error, sur laquelle nous avons placé une condition qui garantit que la tâche ne se produit que si la propriété PublishDestination n'a pas été définie. Cela vous interceptera et sortira une erreur de la construction au cas où vous auriez oublié de spécifier la propriété PublishDestination. Nous appelons ensuite la tâche MakeDir pour créer ce répertoire PublishDestination s'il n'existe pas déjà.
Nous définissons ensuite un élément appelé PublishFiles qui représente tous les fichiers trouvés sous le dossier _PackageTempDir. La tâche de copie est alors appelée et copie tous ces fichiers dans le dossier de destination de publication. L'attribut DestinationFiles sur l'élément Copy est un peu complexe; il effectue une transformation des éléments et convertit leurs chemins en nouveaux chemins enracinés dans le dossier PublishDestination (consultez Métadonnées d'élément bien connues pour voir ce que signifient ces% () s).
Pour appeler cette cible à partir de la ligne de commande, nous pouvons maintenant simplement exécuter cette commande (en changeant évidemment le nom du fichier du projet et les propriétés selon vos besoins):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
existe pour la compatibilité descendante. VS2010 nécessite que cette importation existe, même si elle est ignorée en raison de la condition erronée. Si vous regardez à nouveau, vous verrez que le csproj contient une autre importation pour$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
laquelle résout le fichier cibles pour la version actuelle de Visual Studio.