Построение раствора, содержащего проект веб-приложения с использованием 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 не распознает это и поэтому выглядит не в том месте.
Два решения я так далеко не идеальны:
- вручную скопировать файл на 64-битной из Program Files (x86) в Program Files. Это плохое решение - каждый разработчик должен будет сделать это вручную.
- Вручную отредактируйте файл csproj, чтобы MSBuild выглядел в нужном месте. Опять же не идеально: я бы предпочел не требовать, чтобы все на 64-битном языке вручную редактировали файлы csproj в каждом новом проекте.
, например.
<Import Project="$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)" Condition="Exists('$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)')" />
В идеале я хочу способ сказать MSBuild импортировать целевой файл сформировать правильное место из командной строки, но I can't work out how to do that. Любые решения?
Больших обходной пути! Вы заставили меня думать, и вызывается 32-разрядная версия MSBuild, которая находится в папке C: \ Windows \ Microsoft.NET \ Framework (64-разрядная версия MSBuild находится в папке Framework64). Благодаря! –
Да, наверное, я должен был упомянуть, что у меня 32-битная оболочка, настроенная на использование vcvarsall.bat (который по умолчанию использует x86). Моя 64-битная оболочка переходит в amd64 к тому же пакетному файлу для настройки моей среды. Какой BTW не будет работать, за исключением того, что я использую функцию PSCX под названием Invoke-BatchFile, которая делает изменения переменной env, сделанные vcvarsall.bat постоянными для оболочки. –
BTW, вот как я настраиваю свои разные оболочки битты: $ vcargs =?: {$ Pscx: Is64BitProcess} {'amd64'} {'x86'}; $ VS90VCVarsBatchFile = "$ {env: VS90COMNTOOLS} .. \ .. \ VC \ vcvarsall.bat"; Invoke-BatchFile $ VS90VCVarsBatchFile $ vcargs. Invoke-BatchFile, как я упоминал ранее, является частью http://pscx.codeplex.com. –