déjà permuté à MS Connect:Redéfinition MSBuildExtensionsPath dans la tâche MSBuild est floconneuse
https://connect.microsoft.com/VisualStudio/feedback/details/560451
Je cherche à passer outre la propriété $ (MSBuildExtensionsPath) lors de la construction d'une solution contenant un C# application web projet via msbuild. Je le fais parce qu'un fichier csproj d'application web importe le fichier "$ (MSBuildExtensionsPath) \ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets". Ce fichier est installé par Visual Studio à l'emplacement $ (MSBuildExtensionsPath) standard (C: \ Program Files \ MSBuild). Je voudrais éliminer la dépendance sur ce fichier étant installé sur la machine (je voudrais garder mes serveurs de construction aussi "propres" que possible). Pour ce faire, je voudrais inclure le Microsoft.WebApplication.targets dans le contrôle de la source avec mon projet, puis remplacer $ (MSBuildExtensionsPath) afin que le csproj importera cette version incluse de Microsoft.WebApplication.targets. Cette approche me permet de supprimer la dépendance sans me demander de modifier manuellement le fichier csproj de l'application Web.
Ce schéma fonctionne correctement lorsque je compile mon fichier de solution à partir de la ligne de commande, en fournissant la valeur personnalisée de $ (MSBuildExtensionsPath) à la ligne de commande à msbuild via l'indicateur/p. Toutefois, si je tente de générer la solution à l'aide de la tâche MSBuild dans un fichier de projet msbuild personnalisé (remplaçant MSBuildExtensionsPath à l'aide de l'attribut "Properties"), il échoue car le fichier csproj de l'application Web tente d'importer les Microsoft.WebApplication.targets emplacement "standard" Microsoft.WebApplication.targets (C: \ Program Files \ MSBuild). Notamment, si je lance msbuild en utilisant la tâche "Exec" dans mon fichier de projet personnalisé, cela fonctionne. Encore plus particulièrement, la première fois que je lance la construction en utilisant la tâche "MSBuild" APRÈS avoir exécuté la construction en utilisant la tâche "EXEC" (ou directement à partir de la ligne de commande), la construction fonctionne.
Quelqu'un at-il déjà vu un comportement comme celui-ci? Suis-je fou? Est-ce que quelqu'un est au courant de la cause première de ce problème, une solution de contournement possible, ou si c'est un bug légitime dans MSBuild?
Procédure pour reproduire:
1) Créer une nouvelle solution vide MSVS 2008 (Fake.sln)
2) Ajouter un nouveau C# application Web à la solution (WebApplication1.csproj)
3) Fermer MSVS
4) Copiez le contenu de "C: \ Program Files \ MSBuild \" dans un répertoire appelé "MSBuildExtensions" dans le répertoire contenant votre solution. 5) renommer le répertoire "C: \ Programmes \ MSBuild \ Microsoft \ VisualStudio \ v9.0 \ WebApplications" afin que WebApplication1.csproj ne puisse pas importer les fichiers Microsoft.WebApplication.targets à partir de cet emplacement.
6) Créez un fichier de projet MSBuild personnalisé appelé "TestBuild.proj" dans le même répertoire que la solution. Il devrait avoir le contenu suivant:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="BuildMSBuild">
<PropertyGroup>
<MSBuildExtensionsPath>$(MSBuildProjectDirectory)\MSBuildExtensions\</MSBuildExtensionsPath>
<BuildThis>Fake.sln</BuildThis>
</PropertyGroup>
<Target Name="BuildMSBuild">
<MSBuild Projects="$(BuildThis)" Properties="MSBuildExtensionsPath=$(MSBuildExtensionsPath);" Targets="Clean" />
<MSBuild Projects="$(BuildThis)" Properties="MSBuildExtensionsPath=$(MSBuildExtensionsPath);"/>
</Target>
</Project>
7) exécuter « msbuild TestBuild.proj » à partir d'une invite de commande VSM (note: la construction peut réussir la première fois, mais échouera si vous exécutez plus d'une fois)
Pourriez-vous publier votre fichier de projet msbuild personnalisé, pour voir ce qui ne va pas. –
Ajout d'instructions de repro à la question. Merci! –
Impossible de repro sur ma machine. Attention: si votre projet est créé sur une machine 64 bits, la propriété est nommée: MSBuildExtensionsPath32 et fonctionne comme MSBuildExtensionsPath –