web-dev-qa-db-fra.com

Le script MSBuild et la publication VS2010 appliquent la transformation Web.config

J'ai donc installé VS 2010 et je suis en train de modifier mon script MSBuild pour notre intégration de build TeamCity. Tout fonctionne très bien à une exception près.

Comment puis-je dire à MSBuild que je souhaite appliquer les fichiers de transformation Web.conifg que j'ai créés lors de la publication de la génération ...

J'ai ce qui suit qui produit le site Web compilé mais, il génère un fichier Web.config, Web.Debug.config et Web.Release.config (tous 3) dans le répertoire de sortie compilé. En studio, lorsque j'effectue une publication dans un système de fichiers, il effectue la transformation et ne produit le Web.config qu'avec les modifications appropriées ...

<Target Name="CompileWeb">
    <MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>

<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
    <MSBuild Projects="myproj.csproj"
    Targets="ResolveReferences;_CopyWebApplication"
    Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
                OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>

Toute aide est la bienvenue..!

Je sais que cela peut être fait par d'autres moyens mais je voudrais le faire en utilisant la nouvelle méthode VS 2010 si possible

70
xspydr

Je cherchais des informations similaires et je ne les ai pas tout à fait trouvées, j'ai donc fouillé dans les fichiers .targets fournis avec Visual Studio 2010 et MSBuild 4.0. J'ai pensé que c'était le meilleur endroit pour rechercher la tâche MSBuild qui effectuerait la transformation.

Pour autant que je sache, la tâche MSBuild suivante est utilisée:

<Project ToolsVersion="4.0"
         DefaultTargets="Deploy"
         xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">

    <UsingTask TaskName="TransformXml"
               AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

    <PropertyGroup>
        <ProjectPath>C:\Path to Project\Here</ProjectPath>
        <DeployPath>C:\Path to Deploy\There</DeployPath>
        <TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
        <TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
        <TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
        <StackTraceEnabled>False</StackTraceEnabled>
    </PropertyGroup>


    <Target Name="Transform">
        <TransformXml Source="$(TransformInputFile)"
                      Transform="$(TransformFile)"
                      Destination="$(TransformOutputFile)"
                      Condition="some condition here"
                      StackTrace="$(StackTraceEnabled)" />
    </Target>
</Project>

J'ai testé ce qui précède et je peux confirmer que cela fonctionne. Vous devrez peut-être modifier légèrement la structure pour mieux l'adapter à votre script de génération.

63

Vous devriez pouvoir accomplir cela en utilisant la cible Package et en spécifiant le répertoire temp.

msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish

http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

13
pattersonc

Vous pouvez également essayer d'utiliser l'outil de transformation XDT :

http://ctt.codeplex.com

J'utilise ceci au lieu de jouer avec des cibles msbuild obscures. Fonctionne avec app.config pas seulement web.config .

8
Brian Chavez

Cela a fonctionné pour moi avec le changement suivant

<MSBuild Projects="$(ProjectFile)"
         Targets="ResolveReferences;_WPPCopyWebApplication"
     Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />

À partir du fichier Microsoft.WebApplication.targets sous le dossier MsBuild

_CopyWebApplication

This target will copy the build outputs along with the 
content files into a _PublishedWebsites folder.

This Task is only necessary when $(OutDir) has been redirected
to a folder other than ~\bin such as is the case with Team Build.

The original _CopyWebApplication is now a Legacy, you can still use it by 
 setting $(UseWPP_CopyWebApplication) to true.
By default, it now change to use _WPPCopyWebApplication target in
 Microsoft.Web.Publish.targets.   
It allow to leverage the web.config trsnaformation.
5
Syam

Je ne suis pas un expert de MSBuild, mais j'ai pu utiliser les informations de ce lien pour accomplir la même tâche:

http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

Il y a une section liée à MSBuild vers le bas de l'article. J'espère que cela t'aides.

0
Jonathan S.

Une autre réponse à ce sujet après avoir cherché pendant des jours avant d'aborder ce problème:

Votre profil de publication et les noms de configuration doivent correspondre.

Dans mon cas, pas le mien. La publication manuelle via le profil de publication m'a donné le résultat souhaité, car ma configuration était définie dans le profil de publication. MSBuild essaie cependant d'être intelligent et connecte comme par magie le profil de publication et la configuration en fonction du nom. (L'ajout de/p: Configuration dans la commande a entraîné d'autres erreurs étranges sur le chemin de sortie d'un projet référencé).

Juste pour être exactement clair dans ce que je veux dire:

instruction MSBuild à partir de la ligne de commande

msbuild myproject.csproj -t: Clean -t: Rebuild/p: DeployOnBuild = true/p: PublishProfile = "Development"

FONCTIONNE

  • Nom du profil de publication : Développement
  • Nom de la configuration de la solution : Développement

NE FONCTIONNE PAS

  • Nom du profil de publication : Développement
  • Nom de la configuration de la solution : Dev

J'espère que cela t'aides!

0
Hutjepower