Это уже добавлено в MS Connect:
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) Создать новое пустое решение в MSVS 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» из командной строки MSVS (примечание: сборка может завершиться успешно в первый раз, но не удастся, если вы запустите более одного раза)