2010-03-26 10 views
4

Construire une solution contenant un projet d'application Web en utilisant MSBuild de Powershell comme ceci:projet de construction d'applications Web en utilisant MSBuild de la ligne de commande sur 64 bits: cibles fichier manquant

msbuild "/p:OutDir=$build_dir\" $solution_file 

fonctionne bien pour moi sur 32 bits , mais sur une machine 64 bits, je suis en cours d'exécution dans cette erreur:

error MSB4019: The imported project "C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the declaration is correct, and that the file exists on disk.

J'utilise Visual studio 2008 et v2 Powershell. Le problème a déjà été documenté here et here. Fondamentalement sur l'installation 64 bits de VS, les Microsoft.WebApplication.targets requis par MSBuild se trouvent dans le répertoire Program Files (x86), pas dans le répertoire Program Files, mais MSBuild ne le reconnaît pas et semble au mauvais endroit.

Les deux solutions que j'ai à ce jour ne sont pas idéales:

  1. Copiez manuellement le fichier sur 64 bits de Program Files (x86) Program Files. C'est une solution médiocre - chaque dev devra le faire manuellement.
  2. Modifiez manuellement le fichier csproj afin que MSBuild soit au bon endroit. Encore une fois pas idéal: je préférerais ne pas avoir tout le monde sur 64 bits pour éditer manuellement les fichiers csproj sur chaque nouveau projet.

par exemple.

<Import Project="$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)" Condition="Exists('$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)')" /> 

Idéalement je veux une façon de dire MSBuild pour importer le fichier cible forment le bon endroit de la ligne de commande, mais I can't work out how to do that. Des solutions?

Répondre

1

Cela devrait fonctionner sans aucune modification sur une machine 64 bits SI vous exécutez msbuild à partir d'une invite 32 bits. Compte tenu de ce fichier de test:

<Project 
    DefaultTargets="Test" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="3.5"> 

    <Target Name="Test"> 
    <Message text="$(MSBuildExtensionsPath)"/> 
    </Target> 
</Project> 

Je reçois ce résultat d'un 32 bits PowerShell invite sur mon système x64:

PS> msbuild test.proj /nologo 
Build started 3/26/2010 9:13:10 AM. 
Project "C:\temp\test.proj" on node 0 (default targets). 
    C:\Program Files (x86)\MSBuild 
Done Building Project "C:\temp\test.proj" (default targets). 

Ce ne devrait pas également être un problème si vous exécutez directement à partir de VS parce que VS est une application 32 bits.

+0

Grande solution! Vous m'avez pensé, et en appelant la version 32 bits de MSBuild qui se trouve dans le dossier C: \ Windows \ Microsoft.NET \ Framework (le MSBuild 64 bits est dans le dossier Framework64) fonctionne également. Merci! –

+0

Oui, j'aurais probablement dû mentionner que j'ai un shell 32 bits configuré pour utiliser vcvarsall.bat (qui utilise par défaut x86). Mon shell 64 bits transmet en amd64 ce même fichier batch pour configurer mon environnement. Qui BTW, ne fonctionnerait pas, sauf que j'utilise une fonction PSCX appelée Invoke-BatchFile qui rend les changements de variable d'environnement fait par vcvarsall.bat permanent à l'interpréteur de commandes. –

+0

BTW, voici comment je configure mes différents shells bitness: $ vcargs =?: {$ Pscx: Is64BitProcess} {'amd64'} {'x86'}; $ VS90VCVarsBatchFile = "$ {env: VS90COMNTOOLS} .. \ .. \ VC \ vcvarsall.bat"; Invoke-BatchFile $ VS90VCVarsBatchFile $ vcargs. Invoke-BatchFile comme je l'ai mentionné précédemment fait partie de http://pscx.codeplex.com. –

2

Vous avez deux autres alternatives:

Depuis MSBuild travaille essentiellement hors des variables environnementales, vous pouvez toujours changer simplement Program Files pour être ProgramFiles (x86) avant de commencer msbuild.

$env:ProgramFiles = ${env:ProgramFiles(x86)} 

Cela devrait duper MSBuild en regardant dans le bon endroit

L'autre approche que je peux penser est d'utiliser Start-Job pour exécuter MSBuild à partir du script. Ceci est plus d'une solution à usage général:

Start-Job { 
    Import-Module YourProject 
    Start-YourMsBuildProject 
} -RunAs32 

Hope this helps

+0

Ou, exécutez 'C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat' qui définit les variables d'environnement. –

+0

Vraiment de bonnes idées, mais j'ai préféré que Keith lui donne la tique verte. Auriez-vous besoin de redéfinir la variable d'environnement? J'essaie de ne pas aller près d'eux. Vous pensez que votre idée Start-Job est bonne, est-ce que cela signifie que la version 32 bits de msbuild est utilisée? –