2017-01-23 3 views
1

J'utilise l'extension VS 'SlowCheetah' pour transformer notre app.config avec différentes valeurs en fonction de la configuration du projet. Ainsi, une configuration 'Debug' produit un app.config avec des valeurs appropriées pour les utilisateurs Dev/Qa, alors qu'une version 'Release' produit un app.config avec des valeurs de production.Conditions MSBuild pour empêcher la transformation XML app.config

Le .csproj contient une section comme ceci:

<ItemGroup> 
<None Include="App.config"> 
    <SubType>Designer</SubType> 
    <TransformOnBuild>true</TransformOnBuild> 
</None> 
<None Include="App.Debug.config"> 
    <DependentUpon>App.config</DependentUpon> 
    <IsTransformFile>True</IsTransformFile> 
    <SubType>Designer</SubType> 
</None>  
<None Include="App.Release.config"> 
    <DependentUpon>App.config</DependentUpon> 
    <IsTransformFile >True</IsTransformFile>  
</None> 
<None Include="packages.config" /> 
<None Include="Properties\SlowCheetah\SlowCheetah.Transforms.targets" /> 

Et la logique msbuild est contenue principalement dans le fichier 'SlowCheetah.Transforms.targets'. Mes fichiers sont en cours de transformation correctement. Je veux protéger contre un développeur exécutant accidentellement une version 'Release' à l'intérieur de Visual Studio et exécutant par inadvertance mon application avec un fichier de configuration de production. Mon idée est d'utiliser une condition msbuild, peut-être quelque chose comme:

Condition=" '$(BuildingInsideVisualStudio)'=='true' " 

Je l'ai essayé d'utiliser cette condition dans plusieurs endroits dans le fichier .csproj sans succès. Je suppose que je pourrais obtenir ce travail si je modifie le fichier 'SlowCheetah.Transforms.targets' lui-même, mais ce fichier ne devrait pas être modifié en fonction des commentaires en haut. Idéalement, je voudrais que TOUTES les configurations de builds dans Visual Studio utilisent mon fichier de configuration Debug, et que 'Release' soit construit en dehors de Visual Studio (comme les builds sur un serveur d'intégration continue) pour utiliser le fichier app app.config, mais je »se contenter de pouvoir empêcher l'exécution accidentelle d'une version« Release »dans Visual Studio. Toute suggestion quant à savoir si/comment cela peut être réalisé est appréciée.

Répondre

1

Ajouter ce juste avant </Project>:

<Target Name="BeforeBuild"> 
    <Error Condition=" '$(BuildingInsideVisualStudio)'=='true' And '$(Configuration)'=='Release' " 
      Text="JMc is so mad at you you trying to build using the Release configuration from Visual Studio." /> 
    </Target> 
+0

Est-ce que le travail bien. Merci. – JMc

+1

Une bonne alternative utilisant la même condition est de spécifier des valeurs DEV dans app.config et une transformation séparée pour la configuration 'Release'. Puis placez la 'Condition' dans le groupe de propriétés 'SlowCheetah'. Le résultat est que la transformation se produit uniquement lors de la construction en dehors de VS. Lorsque vous construisez dans VS, vous obtenez toujours le fichier app app.config. – JMc

+1

$ ([System.IO.Path]: : GetFullPath ($ (MSBuildProjectDirectory) \ .. \ packages \ SlowCheetah.2.5.15 \ tools \)) .... – JMc