Это уже кросс-вывешено на MS Connect:Перекрытие MSBuildExtensionsPath в задаче MSBuild является слоеным
https://connect.microsoft.com/VisualStudio/feedback/details/560451
Я пытаюсь переопределить свойство $ (MSBuildExtensionsPath) при создании раствора, содержащий C# веб-приложение проект через msbuild. Я делаю это, потому что файл csproj веб-приложения импортирует файл «$ (MSBuildExtensionsPath) \ Microsoft \ VisualStudio \ v9.0 \ WebApplications \ Microsoft.WebApplication.targets". Этот файл устанавливается Visual Studio в стандартное местоположение $ (MSBuildExtensionsPath) (C: \ Program Files \ MSBuild). Я хотел бы исключить зависимость от этого файла, установленного на компьютере (я бы хотел, чтобы мои серверы сборки были «чистыми», насколько это возможно). Чтобы сделать это, я хотел бы включить Microsoft.WebApplication.targets в исходный элемент управления с моим проектом, а затем переопределить $ (MSBuildExtensionsPath), чтобы csproj импортировал эту включенную версию Microsoft.WebApplication.targets. Этот подход позволяет мне удалить зависимость, не требуя от меня вручную изменить файл csproj веб-приложения.
Эта схема отлично работает, когда я создаю файл решения из командной строки, поставляя пользовательское значение $ (MSBuildExtensionsPath) в командной строке для msbuild с помощью флага/p. Тем не менее, если я попытаюсь построить решение с помощью задачи MSBuild в файле проекта MSbuild (переопределяя MSBuildExtensionsPath с помощью атрибута «Свойства»), он терпит неудачу, потому что файл csproj веб-приложения пытается импортировать файлы Microsoft.WebApplication.targets из «стандартное» местоположение Microsoft.WebApplication.targets (C: \ Program Files \ MSBuild). Примечательно, что если я запустил msbuild, используя задачу «Exec» в моем пользовательском файле проекта, он работает. Еще более важно, В ПЕРВОЕ время, когда я запускаю сборку, используя задачу «MSBuild» ПОСЛЕ того, как я запустил сборку, используя задачу «EXEC» (или непосредственно из командной строки), сборка работает.
Кто-нибудь видел подобное поведение раньше? Я сумасшедший? Кто-нибудь знает о первопричине этой проблемы, о возможном обходном пути или о том, является ли это законной ошибкой в MSBuild?
Шаги по воспроизведению:
1) Создайте новый пустой решение в МСВС 2008 (Fake.sln)
2) Добавить новый C# веб-приложение к решению (WebApplication1.csproj)
3) Закрыть MSVS
4) Скопируйте содержимое «C: \ Program Files \ MSBuild \» в каталог с именем «MSBuildExtensions» в каталоге, содержащем ваше решение.
5) переименуйте каталог «C: \ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v9.0 \ WebApplications», чтобы WebApplication1.csproj не смог импортировать файлы Microsoft.WebApplication.targets из этого местоположения.
6) Создайте пользовательский файл проекта MSBuild с именем «TestBuild.proj» в том же каталоге, что и решение. Он должен иметь следующее содержание:
<?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) выполнить «MsBuild TestBuild.proj» из командной строки МСВС (примечание: сборка может добиться успеха в первый раз, но потерпит неудачу, если вы работаете больше, чем один раз)
Не могли бы вы разместить свой собственный файл проекта msbuild, чтобы узнать, что пошло не так. –
Добавлены инструкции для воспроизведения на вопрос. Благодаря! –
Не удалось воспроизвести на моей машине. Опасайтесь: если ваш проект создан на 64-битной машине, свойство называется: MSBuildExtensionsPath32 и работает как MSBuildExtensionsPath –