2010-03-26 2 views
4

Построение раствора, содержащего проект веб-приложения с использованием MSBuild из PowerShell, как это:Проект здания веб-приложений с использованием MSBuild из командной строки на 64-бит: отсутствуют целевые файл

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

отлично работает для меня на 32-битной , но на 64-битной машине я бегу в эту ошибку:

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.

Я использую Visual Studio 2008 и Powershell v2. Проблема уже задокументирована here и here. В основном на 64-битной установке VS, файлы Microsoft.WebApplication.targets, необходимые MSBuild, находятся в директории Program Files (x86), а не в каталоге Program Files, но MSBuild не распознает это и поэтому выглядит не в том месте.

Два решения я так далеко не идеальны:

  1. вручную скопировать файл на 64-битной из Program Files (x86) в Program Files. Это плохое решение - каждый разработчик должен будет сделать это вручную.
  2. Вручную отредактируйте файл csproj, чтобы MSBuild выглядел в нужном месте. Опять же не идеально: я бы предпочел не требовать, чтобы все на 64-битном языке вручную редактировали файлы csproj в каждом новом проекте.

, например.

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

В идеале я хочу способ сказать MSBuild импортировать целевой файл сформировать правильное место из командной строки, но I can't work out how to do that. Любые решения?

ответ

1

Это должно работать без каких-либо изменений на 64-битной машине IF вы запускаете msbuild из 32-разрядной строки. Учитывая этот тестовый файл:

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

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

Я получаю этот результат с 32-битной PowerShell подскажет на моей системе 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). 

Это также не должно быть проблемой, если вы работаете непосредственно с VS, потому что VS - это 32-битное приложение.

+0

Больших обходной пути! Вы заставили меня думать, и вызывается 32-разрядная версия MSBuild, которая находится в папке C: \ Windows \ Microsoft.NET \ Framework (64-разрядная версия MSBuild находится в папке Framework64). Благодаря! –

+0

Да, наверное, я должен был упомянуть, что у меня 32-битная оболочка, настроенная на использование vcvarsall.bat (который по умолчанию использует x86). Моя 64-битная оболочка переходит в amd64 к тому же пакетному файлу для настройки моей среды. Какой BTW не будет работать, за исключением того, что я использую функцию PSCX под названием Invoke-BatchFile, которая делает изменения переменной env, сделанные vcvarsall.bat постоянными для оболочки. –

+0

BTW, вот как я настраиваю свои разные оболочки битты: $ vcargs =?: {$ Pscx: Is64BitProcess} {'amd64'} {'x86'}; $ VS90VCVarsBatchFile = "$ {env: VS90COMNTOOLS} .. \ .. \ VC \ vcvarsall.bat"; Invoke-BatchFile $ VS90VCVarsBatchFile $ vcargs. Invoke-BatchFile, как я упоминал ранее, является частью http://pscx.codeplex.com. –

2

У вас есть несколько других альтернатив:

Поскольку MSBuild в основном работает от экологических переменных, вы всегда можете просто изменить Program Files быть ProgramFiles (x86), прежде чем начать MSBuild.

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

Это должно обмануть MSBuild в заглядывая в нужном месте

Другой подход, который я могу вспомнить, используя Start-Job, чтобы запустить MSBuild из сценария. Это больше общего назначение обходное:

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

Надеется, что это помогает

+0

Или запустите 'C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat', который устанавливает переменные среды. –

+0

Действительно хорошие идеи, но мне понравился Кейт, поэтому он дал ему зеленый галочку. Вам нужно снова установить переменную env? Я стараюсь не приближаться к ним. Подумайте, что ваша идея Start-Job хороша, означает ли это, что используется 32-битная версия msbuild? –