Это уже перекрестно разослано в 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 использование "Исполнительной" задачи в моем пользовательском файле проекта, это работает. Еще заметнее в ПЕРВЫЙ раз я выполняю сборку с помощью задачи "MSBuild" ПОСЛЕ ТОГО, КАК я выполнил сборку с помощью "ИСПОЛНИТЕЛЬНОЙ" задачи (или непосредственно из командной строки), работы сборки.
Кто-либо видел поведение как это прежде? Действительно ли я являюсь сумасшедшим? Кто-либо знает о первопричине этой проблемы, возможного обходного решения, или является ли это законной ошибкой в 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" в том же каталоге как решение. Это должно иметь следующее содержание:
$(MSBuildProjectDirectory)\MSBuildExtensions\
Fake.sln
7) выполните "msbuild TestBuild.proj" от командной строки MSVS (примечание: сборка может успешно выполниться в первый раз, но перестанет работать, если Вы работаете несколько раз),
Это ошибка в MSBuild 3.5, но она исправлена в MSBuild 4.
Если возможно, переключитесь на MSBuild 4 (вы все еще можете компилировать проекты 3.5), в противном случае вам придется переопределить свойство в файле проекта.
Он отлично работает, если переопределить MSBuildExtensionsPath
непосредственно в файле .csproj
веб-приложения.
<PropertyGroup>
<MSBuildExtensionsPath>C:\Users\madgnome\Desktop\msbuild</MSBuildExtensionsPath>
<!-- It works too with relative path -->
<!--<MSBuildExtensionsPath>..\msbuild</MSBuildExtensionsPath>-->
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Вы пытались установить переменную среды MSBuildExtensionPath
в командной строке CMD, а затем запустить сборку?
Например:
C:\> SET MSBuildExtensionsPath=C:\My\MSBuild\Extensons
Затем в этом файле проекта:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<Message Text='MSBuildExtensionsPath="$(MSBuildExtensionsPath)"' />
</Target>
</Project>
вы получите следующее вывод:
c:\Users\chuckeng\Desktop\ConsoleApplication1>"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" my.proj
Microsoft (R) Build Engine Version 3.5.30729.4926
[Microsoft .NET Framework, Version 2.0.50727.4927]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 6/25/2010 1:04:05 PM.
Project "c:\my.proj" on node 0 (default targets).
MSBuildExtensionsPath="C:\My\MSBuild\Extensons"
Done Building Project "c:\my.proj" (default targets).
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:00.03
Это работает и с v4.0. Хотя в версии 4.0 для подобных вещей поддержка в целом лучше. Кроме того, v4.0 на 100% обратно совместима (без ошибок). Итак, вы можете создавать свои проекты v3.5 и более ранние с v4.0. Просто выберите ToolsVersion 3.5.
msbuild my.proj /tv:3.5
Надеюсь, это поможет ...
Чак Инглэнд Visual Studio Менеджер программы - MSBuild