Сборка проекта веб-приложения с использованием MSBuild из командной строки в 64-разрядной версии: файл с отсутствующими целями - PullRequest
4 голосов
/ 26 марта 2010

Создание решения, содержащего проект веб-приложения, с использованием MSBuild из powershell, например:

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

У меня нормально работает на 32-битной, но на 64-битной машине я сталкиваюсь с этой ошибкой:

ошибка MSB4019: импортированный проект "C: \ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets" не найден. Убедитесь, что путь в объявлении правильный, и что файл существует на диске.

Я использую Visual Studio 2008 и powershell v2. Проблема уже задокументирована здесь и здесь . В основном при 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 импортировал целевой файл из нужного места из командной строки, но Я не могу понять, как это сделать . Любые решения?

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

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

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

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

Это должно заставить MSBuild искать в правильном месте

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

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

Надеюсь, это поможет

1 голос
/ 26 марта 2010

Это должно работать без каких-либо изменений на 64-битной машине ЕСЛИ вы запускаете 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-битное приложение.

...