33 votes

MsBuild et MsDeploy avec plusieurs environnements

Sont là de bonnes habitudes pour la cartographie des configurations de solution à des environnements et à l'aide de MsDeploy pour l'emballage par l'environnement?

La plus courte version: Prenez ce fichier, et essayer de changer la .msbuild fichier de sorte qu'un package est créé.


Détails

J'ai une solution avec un grand nombre de bibliothèques et d'un ASP.NET application MVC. Je conduis la construire avec un fichier msbuild qui appelle la principale solution et ensuite fait d'autres choses. Je veux utiliser la nouvelle msdeploy l'emballage pour préparer une .fichier zip pour distribution ultérieure, mais je vais avoir des difficultés diverses.

Ma solution dispose de 4 configurations: Local, Dev, Test, et Prod, qui correspondent à des environnements que je veux à la carte. Dans cette solution, toutes les bibliothèques ont Debug et Release modes comme d'habitude. Par exemple, en Local mode solution, toutes les bibliothèques de la compilation en Debug mode. Ensuite, l'application principale est l'appariement des environnements avec de la solution, de sorte que je peux avoir en Web.Dev.config et ainsi de suite, ce qui semble être le moyen naturel d'utiliser les choses.

Si j'paquet comme ça:

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Site\Site.vbproj"
           Targets="Package"/>
</Target>

Je reçois un problème où l' Configuration=Local est mal mappé à la bibliothèque, des projets qui Site.vbproj références, et il ne peut pas compiler.


Je vois deux solutions possibles: l'un, je ne peux pas obtenir de travail de droit, et l'autre est extrêmement laid.

Tentative 1

Je tente d'appeler l' Package cible via la solution (dans cet exemple, "Applications" est le dossier de la solution que le Site du projet est en... j'ai simplifié les choses pour ce post parce qu'il existe de multiples applications dans la solution).

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Publisher.sln"
           Targets="Applications\Site:Package"/>
</Target>

Je pense que c' SolutionFolder\ProjectName:Target syntaxe est la façon de le faire, car :Clean court... cependant, ce lève

error MSB4057: The target "Applications\Site:Package" does not exist in the project.

Tentative 2

Maintenant, pour le laid solution: il fonctionne si je modifie TOUTES mes bibliothèques avoir 4 configurations supplémentaires pour ceux de 4 configurations de solution. Cependant, c'est moche et vraiment un mauvais plan si je veux pour co-développer une bibliothèque partagée plus tard avec un projet qui a des environnements différents. Aussi, ces environnements n'ont rien à voir avec la bibliothèque et n'a de sens que dans le contexte de haut niveau des applications en utilisant les bibliothèques. Un mauvais goût.


Hein?

J'aime avoir de multiples environnements de la solution, et la fantaisie nouveau site Web.config remplacement des trucs, mais je ne sais pas comment appeler la msdeploy Package tâche dans cette situation afin que je puisse construire le paquet dans TeamCity.

(Notez que je ne voulez probablement PAS à appeler le msdeploy ligne de commande, parce que c'est utilisé pour activer une application IIS dans un package. Pas ce que je fais ici.)


Exemple

Encore une fois, j'ai été totalement déconcerté ici, donc si vous voulez de l'aide de l'expérience, je ai mis en place cette solution d'échantillon.

40voto

Julien Hoarau Points 23987

La première tentative a échoué car le Package cible n'existe pas dans le fichier de solution. Lors de l'utilisation de MSBuild sur un fichier de solution, temporaire de projet MSBuild est créé (SamplePackage.la sln.metaproj); ce fichier de projet ne contient que certaines cibles (Construire, Nettoyer, Reconstruire, Publier, ...)

Solution : DeployOnBuild & DeployTarget propriétés

Une façon de faire ce que vous voulez est d'utiliser DeployOnBuild propriété comme cela :

<PropertyGroup Condition="'$(Configuration)' == ''">
  <Platform>Any Cpu</Platform>
  <Configuration>Dev</Configuration>
  <PackageLocation>$(MSBuildProjectDirectory)\package.zip</PackageLocation>
</PropertyGroup>

<Target Name="Build">
  <MSBuild Projects="SamplePackage.sln"
           Targets="Build"/>
</Target>

<Target Name="BuildWebPackage">
  <MSBuild Projects="SamplePackage.sln"
           Properties="Platform=$(Platform);
                       Configuration=$(Configuration);
                       DeployOnBuild=true;
                       DeployTarget=Package;
                       PackageLocation=$(PackageLocation);"/>
</Target>
  • DeployOnBuild=true : déploiement doit être réalisé lors de la construction est appelé
  • DeployTarget=Package : pour le déploiement crée un package
  • PackageLocation : indique le chemin du fichier de package

Autres liens :

0voto

David Gardiner Points 4907

J'ai fait quelque chose de semblable qui peut être utile. Dans un récent projet, nous avons eu 'Dev', 'Test' et 'Prod' environnements.

J'ai ajouté des configurations de solution pour chacun de ces.. par exemple.

  • Libération-Dev
  • Version-Test
  • Libération-Prod

Pour la plupart des projets de la solution, ces configurations ont été simplement liées à la régulière "Libération" de la construction, mais le cas échéant, certains projets n'ont distincte de presse des tests de construire des configurations où il pourrait être en #si/#endif des trucs dans le code.

Cela permettrait également de faire sens pour permettre la personnalisation de votre msdeploy config par la configuration de trop.

Quant à la cible de msbuild. La cible fait référence le nom d'un élément. par exemple, vous pourriez l'appeler msbuild avec /t:BuildWebPackage pour votre exemple ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X